INSERT INTO vs SELECT INTO

В чем разница между использованием

SELECT ... INTO MyTable FROM...

и

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

?

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

  • Какое утверждение предпочтительнее?
  • Есть ли другие последствия для производительности?
  • Что такое хороший прецедент для SELECT... IN IN INSERT INTO...?

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

Ответ 1

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

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

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

ИЗМЕНИТЬ

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

Ответ 2

  • Какой оператор предпочтительнее? Зависит от того, что вы делаете.

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

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

Его иногда используют ненадлежащим образом люди, которые не знают, что они делают. И в результате они могут вызвать хаос в db. Я сильно чувствую, что использовать SELECT INTO для чего-либо другого, кроме таблицы сбрасывания (временная резервная копия, временная таблица, которая будет уходить в конце хранимой процедуры и т.д.). Для постоянных столов требуется реальная мысль относительно их дизайна, и SELECT INTO позволяет легко думать о чем-либо, даже как о базовых, как о столбцах и типах данных.

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

Ответ 3

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

SELECT...INTO MyTable... создает новый MyTable, который раньше не существовал.

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

Ответ 4

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

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

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

РЕДАКТИРОВАТЬ:
Хотя вы можете использовать CREATE TABLE и INSERT INTO для выполнения того, что делает SELECT INTO, с помощью SELECT INTO вам не нужно заранее знать определение таблицы. SELECT INTO, вероятно, включен в SQL, потому что он облегчает задачи, такие как специальные отчеты или таблицы копирования.

Ответ 5

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

Что касается вашего EDIT:

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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

- > Вставить В существующей таблице table.INSERT INTO [tablename] SELECT * FROM A;. Здесь tablename - это существующая таблица.

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

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

Производительность wise Вставить INTO быстро.

Ссылки:

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

Ответ 10

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

SELECT * INTO table

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

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

select into temp table from a huge table 

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

create a temp table 

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