INSERT INTO против SELECT INTO - PullRequest
       20

INSERT INTO против SELECT INTO

117 голосов
/ 05 августа 2011

Какая разница между

SELECT ... INTO MyTable FROM...

и

INSERT INTO MyTable (...)
SELECT ... FROM ....

Из BOL [ INSERT , SELECT ... INTO ], я знаю, что использование SELECT ... INTO создаст таблицу вставки в файловой группе по умолчанию если он еще не существует и что запись в журнал для этого оператора зависит от модели восстановления базы данных.

  1. Какое утверждение предпочтительнее?
  2. Есть ли другие последствия для производительности?
  3. Каков хороший вариант использования SELECT ... INTO вместо INSERT INTO ...?

Редактировать: я уже заявил, что знаю, что этот SELECT INTO ... создает таблицу, где он не существует. То, что я хочу знать, - то, что SQL включает это утверждение по причине, что это? Это делает что-то другое за кулисами для вставки строк, или это просто синтаксический сахар поверх CREATE TABLE и INSERT INTO.

Ответы [ 10 ]

111 голосов
/ 05 августа 2011
  1. Они делают разные вещи.Используйте INSERT, когда таблица существует.Используйте SELECT INTO, когда это не так.

  2. Да.INSERT без табличных подсказок обычно регистрируется.SELECT INTO минимально регистрируется при условии, что установлены правильные флаги трассировки.

  3. По моему опыту SELECT INTO чаще всего используется с промежуточными наборами данных, такими как #temp таблицы, или для копированиявся таблица, как для резервного копирования.INSERT INTO используется при вставке в существующую таблицу с известной структурой.

РЕДАКТИРОВАТЬ

Чтобы выполнить редактирование, они выполняют разные действия.вещи.Если вы создаете таблицу и хотите определить структуру, используйте CREATE TABLE и INSERT.Пример проблемы, которую можно создать: у вас есть маленькая таблица с полем varchar.Самая большая строка в вашей таблице сейчас составляет 12 байтов.Вашему реальному набору данных потребуется до 200 байтов.Если вы сделаете SELECT INTO из своей маленькой таблицы, чтобы создать новую, более поздняя INSERT завершится с ошибкой усечения, потому что ваши поля слишком малы.

21 голосов
/ 05 августа 2011
  1. Какой оператор предпочтительнее? Зависит от того, что вы делаете.

  2. Существуют ли другие последствия для производительности? Если таблица является постоянной таблицей, вы можете создавать индексы во время создания таблицы, что влияет на производительность как отрицательно, так и положительно.Функция выбора в не воссоздает индексы, существующие в текущих таблицах, и, следовательно, последующее использование таблицы может быть медленнее, чем нужно.

  3. Что является хорошим примером использования для SELECT... INTO over INSERT INTO ...? Выбор в используется, если вы не знаете структуру таблицы заранее.Это быстрее писать, чем создавать таблицу и оператор вставки, поэтому он используется для ускорения разработки в разы.Часто это быстрее использовать, когда вы создаете быструю временную таблицу для тестирования или резервную копию определенного запроса (возможно, записи, которые вы собираетесь удалить).Редко можно увидеть его использование в рабочем коде, который будет выполняться несколько раз (за исключением временных таблиц), потому что произойдет сбой, если таблица уже существует.

Иногда его используют ненадлежащим образом люди, которые не знают, что делают.И они могут вызвать хаос в БД в результате.Я считаю, что неуместно использовать SELECT INTO для чего-либо, кроме одноразовой таблицы (временная резервная копия, временная таблица, которая будет удалена в конце сохраненного процесса и т. Д.).Постоянные таблицы нуждаются в реальной мысли в отношении их дизайна, а SELECT INTO позволяет легко не думать ни о чем, даже о базовом, о том, какие столбцы и какие типы данных.оператор создания таблицы и вставки - у вас больше элементов управления, и это лучше для повторяемых процессов.Кроме того, если таблица представляет собой постоянную таблицу, ее следует создавать из отдельного сценария создания таблицы (который находится в управлении исходным кодом), поскольку создание постоянных объектов не должно, как правило, в коде вставляться / удаляться / обновляться или выбираться изТаблица.Изменения объектов должны обрабатываться отдельно от изменений данных, поскольку объекты имеют последствия, выходящие за рамки потребностей конкретной вставки / обновления / выбора / удаления.Вам необходимо рассмотреть лучшие типы данных, подумать об ограничениях FK, PK и других ограничениях, рассмотреть требования аудита, подумать об индексации и т. Д.

5 голосов
/ 05 августа 2011

Основное отличие состоит в том, что SELECT INTO MyTable создаст новую таблицу с именем MyTable с результатами, в то время как INSERT INTO требует, чтобы MyTable уже существовал.

Вы должны использовать SELECT INTO только в случае, когда таблица нене существует, и вы хотели создать его на основе результатов вашего запроса.Таким образом, эти два утверждения действительно несопоставимы.Они делают совершенно разные вещи.

В общем, SELECT INTO чаще используется для однократных задач, а INSERT INTO регулярно используется для добавления строк в таблицы.

EDIT: Хотя вы можете использовать CREATE TABLE и INSERT INTO для выполнения того, что делает SELECT INTO, с SELECT INTO вам не нужно заранее знать определение таблицы.SELECT INTO, вероятно, включен в SQL, потому что он значительно упрощает такие задачи, как создание специальных отчетов или копирование таблиц.

4 голосов
/ 05 августа 2011

На самом деле SELECT ... INTO не только создает таблицу, но и завершается ошибкой, если она уже существует, поэтому в основном вы можете использовать ее только тогда, когда вставляемая таблица не существует.

Что касается вашего РЕДАКТИРОВАНИЯ:

Лично я в основном использую SELECT ... INTO , когда создаю временную таблицу.Это для меня является основным использованием.Однако я также использую его при создании новых таблиц со многими столбцами, структура которых аналогична другим таблицам, а затем редактирую их, чтобы сэкономить время.

4 голосов
/ 05 августа 2011

Каждый оператор имеет отдельный вариант использования. Они не являются взаимозаменяемыми.

SELECT...INTO MyTable... создает новый MyTable там, где его раньше не было.

INSERT INTO MyTable...SELECT... используется, когда MyTable уже существует.

2 голосов
/ 05 августа 2011

SELECT INTO обычно используется для создания временных таблиц или для копирования другой таблицы (данных и / или структуры).

В повседневном коде вы используете INSERT, потому что ваши таблицы уже должны существовать для чтения, UPDATEd, DELETEd, JOINed и т. Д. Примечание: ключевое слово INTO необязательно с INSERT

То есть приложения обычно не создают и не удаляют таблицы как часть обычных операций, если только это не временная таблица для некоторого ограниченного объема и конкретного использования.

Таблица, созданная с помощью SELECT INTO, не будет иметь ключей, индексов или ограничений в отличие от реальной, сохраняющейся, уже существующей таблицы

2 не сопоставимы напрямую, поскольку они практически не перекрываются при использовании

1 голос
/ 25 мая 2016

Я только хочу затронуть второй пункт вопроса, который связан с производительностью, потому что никто другой не рассмотрел это. Select Into намного быстрее, чем insert, когда дело доходит до таблиц с большими наборами данных. Я предпочитаю выбирать, когда мне нужно прочитать очень большую таблицу. вставка в таблицу с 10 миллионами строк может занять несколько часов, в то время как select into сделает это за минуты, а что касается потери индексов в новой таблице, вы можете воссоздать индексы по запросу и при этом сэкономить намного больше времени по сравнению с вставить в.

0 голосов
/ 12 марта 2017

Простая разница между select Into и Insert Into: -> Выберите Into, чтобы не нуждаться в существующей таблице. Если вы хотите скопировать данные таблицы A, просто введите Select * INTO [имя таблицы] из A. Здесь имя таблицы может быть существующей таблицей, или будет создана новая таблица, которая имеет такую ​​же структуру, как таблица A.

-> Вставить в нужную таблицу. INSERT INTO [имя_таблицы] SELECT * FROM A ;. Здесь tablename является существующей таблицей.

Выберите Into, как правило, более популярно для копирования данных, особенно данных резервного копирования.

Вы можете использовать согласно вашему требованию, это полностью выбор разработчика, который должен использоваться в его сценарии.

Быстродействие INTO - это быстро.

Рекомендации:

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp

0 голосов
/ 07 сентября 2016

Выбор для больших наборов данных может быть полезен только для одного пользователя, использующего одно единственное соединение с базой данных, выполняющее задачу массовой операции. Я не рекомендую использовать

SELECT * INTO table

, поскольку это создает одну большую транзакцию и создает блокировку схемы для создания объекта, не позволяя другим пользователям создавать объекты или обращаться к системным объектам до завершения операции SELECT INTO.

В качестве доказательства концепции откройте 2 сессии, в первой сессии попытайтесь использовать

select into temp table from a huge table 

и во втором разделе попробуйте

create a temp table 

и проверьте блокировки, блокировки и продолжительность второго сеанса для создания объекта временной таблицы. Моя рекомендация - всегда хорошая практика для создания и вставки оператора, и при необходимости для минимального ведения журнала используйте флаг трассировки 610.

0 голосов
/ 04 августа 2015

Выберите в создает новую таблицу для вас в то время, а затем вставьте в нее записи из исходной таблицы. Вновь созданная таблица имеет ту же структуру, что и исходная таблица. Если вы попытаетесь использовать select into для существующей таблицы, это приведет к ошибке, поскольку она попытается создать новую таблицу с тем же именем. Для вставки требуется, чтобы таблица существовала в вашей базе данных, прежде чем вставлять в нее строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...