В чем разница между использованием
SELECT ... INTO MyTable FROM...
и
INSERT INTO MyTable (...)
SELECT ... FROM ....
?
Из BOL [ INSERT , SELECT ... INTO ] я знаю, что использование SELECT ... INTO создаст таблицу вставки в группе файлов по умолчанию, если она еще не существует, и что ведение журнала для этого оператора зависит от восстановления модель базы данных.
- Какое утверждение предпочтительнее?
- Есть ли другие последствия для производительности?
- Как лучше использовать SELECT ... INTO вместо INSERT INTO ...?
Изменить: я уже заявил, что знаю, что SELECT INTO ... создает таблицу, в которой ее не существует. Я хочу знать, что SQL включает этот оператор по какой-то причине, что это такое? Делает ли он что-то другое за кулисами для вставки строк, или это просто синтаксический сахар поверх CREATE TABLE
и INSERT INTO
.
sql-server
tsql
sql-server-2008
jowenece
источник
источник
INSERT INTO
два ключевых слова (select & into), которые дают миру понять, что это не обычный оператор SQL, хотяSELECT ... INTO
начинает, по крайней мере, выглядеть как обычный оператор SQL. Небольшая причина отдать предпочтение первому.Ответы:
Они делают разные вещи. Используйте,
INSERT
когда таблица существует. Используйте,SELECT INTO
когда это не так.Да.
INSERT
без табличных подсказок обычно регистрируется.SELECT INTO
минимально регистрируется при условии, что установлены правильные флаги трассировки.По моему опыту
SELECT INTO
, чаще всего используется с промежуточными наборами данных, такими как#temp
таблицы, или для копирования всей таблицы, например, для резервного копирования.INSERT INTO
используется при вставке в существующую таблицу с известной структурой.РЕДАКТИРОВАТЬ
Чтобы решить вашу проблему редактирования, они делают разные вещи. Если вы составляете таблицу и хотите определить структуру, используйте
CREATE TABLE
иINSERT
. Пример проблемы, которая может быть создана: у вас есть небольшая таблица с полем varchar. Самая большая строка в вашей таблице теперь составляет 12 байтов. Вашему реальному набору данных потребуется до 200 байт. Если вы сделаетеSELECT INTO
из своей небольшой таблицы новую, последняяINSERT
завершится ошибкой с ошибкой усечения, потому что ваши поля слишком малы.источник
CREATE TABLE
а затем.INSERT INTO
Кроме того, проще протестироватьSELECT
инструкцию самостоятельно, не выполняя вставку.SELECT INTO
чтобы сделать временную таблицу или сделать быстрое резервное копирование существующей таблицы, с которой я собираюсь обезопасить себя.CREATE
заявление.Какое утверждение предпочтительнее? Зависит от того, что вы делаете.
Есть ли другие последствия для производительности? Если это постоянная таблица, вы можете создавать индексы во время создания таблицы, что отрицательно и положительно сказывается на производительности. Select into не воссоздает индексы, существующие в текущих таблицах, и поэтому последующее использование таблицы может быть медленнее, чем должно быть.
Как лучше использовать SELECT ... INTO вместо INSERT INTO ...? Select into используется, если вы не знаете структуру таблицы заранее. Это быстрее написать, чем создать таблицу и оператор вставки, поэтому он используется для ускорения разработки в разы. Часто бывает быстрее использовать, когда вы создаете быструю временную таблицу для тестирования или резервную копию определенного запроса (возможно, записи, которые вы собираетесь удалить). Редко можно увидеть его использование в производственном коде, который будет выполняться несколько раз (за исключением временных таблиц), потому что он завершится ошибкой, если таблица уже существует.
Иногда его ненадлежащим образом используют люди, которые не знают, что делают. И в результате они могут вызвать хаос в базе данных. Я категорически считаю неуместным использовать SELECT INTO для чего-либо, кроме одноразовой таблицы (временная резервная копия, временная таблица, которая исчезнет в конце сохраненной процедуры и т. Д.). Постоянные таблицы должны реальные мысли , чтобы их дизайн и SELECT INTO позволяет легко не думать ни о чем даже основные, какие столбцы и какие типы данных.
В общем, я предпочитаю использовать команду create table и insert - у вас больше элементов управления, и это лучше для повторяемых процессов. Кроме того, если таблица является постоянной таблицей, она должна быть создана из отдельного сценария создания таблицы (тот, который находится в системе управления версиями), поскольку создание постоянных объектов, как правило, не должно в коде вставлять / удалять / обновлять или выбирать из стол. Изменения объекта должны обрабатываться отдельно от изменений данных, поскольку объекты имеют последствия, выходящие за рамки потребностей конкретной вставки / обновления / выбора / удаления. Вам необходимо рассмотреть лучшие типы данных, подумать об ограничениях FK, PK и других ограничениях, рассмотреть требования аудита, подумать об индексировании и т. Д.
источник
Основное отличие состоит в том, что SELECT INTO MyTable создаст новую таблицу с именем MyTable с результатами, а INSERT INTO требует, чтобы MyTable уже существовал.
Вы должны использовать SELECT INTO только в том случае, если таблица не существует и вы хотите создать ее на основе результатов вашего запроса. По сути, эти два утверждения несопоставимы. Они делают разные вещи.
Как правило, SELECT INTO чаще используется для одноразовых задач, а INSERT INTO используется регулярно для добавления строк в таблицы.
РЕДАКТИРОВАТЬ:
хотя вы можете использовать CREATE TABLE и INSERT INTO для выполнения того, что делает SELECT INTO, с SELECT INTO вам не нужно заранее знать определение таблицы. SELECT INTO, вероятно, включен в SQL, поскольку он значительно упрощает такие задачи, как создание специальных отчетов или копирование таблиц.
источник
У каждого оператора есть отдельный вариант использования. Они не взаимозаменяемы.
SELECT...INTO MyTable...
создает новыйMyTable
там, где его раньше не было.INSERT INTO MyTable...SELECT...
используется, еслиMyTable
уже существует.источник
На самом деле SELECT ... INTO не только создает таблицу, но и завершается ошибкой, если она уже существует, поэтому в основном вы могли бы использовать ее только тогда, когда таблица, в которую вы вставляете, не существует.
Что касается вашего EDIT:
Лично я в основном использую SELECT ... INTO, когда создаю временную таблицу. Для меня это главное использование. Однако я также использую его при создании новых таблиц с множеством столбцов со структурой, аналогичной другим таблицам, а затем редактирую их, чтобы сэкономить время.
источник
SELECT INTO обычно используется для создания временных таблиц или для копирования другой таблицы (данных и / или структуры).
В повседневном коде вы используете INSERT, потому что ваши таблицы уже должны существовать для чтения, UPDATEd, DELETEd, JOINed и т. Д. Примечание: ключевое слово INTO является необязательным для INSERT
То есть приложения обычно не создают и не удаляют таблицы как часть обычных операций, если только это не временная таблица для определенного ограниченного объема и конкретного использования.
Таблица, созданная с помощью SELECT INTO, не будет иметь ключей, индексов или ограничений в отличие от реальной, постоянной, уже существующей таблицы.
Эти 2 нельзя напрямую сравнивать, потому что они почти не совпадают в использовании.
источник
Я хочу затронуть только второй пункт вопроса, связанный с производительностью, потому что никто другой не рассматривал этот вопрос. Select Into намного быстрее, чем вставка в, когда дело касается таблиц с большими наборами данных. Я предпочитаю выбирать, когда мне нужно прочитать очень большую таблицу. Вставка в таблицу с 10 миллионами строк может занять несколько часов, в то время как select into сделает это за минуты, а что касается потери индексов в новой таблице, вы можете воссоздать индексы по запросу и при этом сэкономить намного больше времени по сравнению с вставить в.
источник
insert into #temp with(tablock) select * from ..
примерно такая же, как дляselect * into #temp from ...
Select into создает для вас новую таблицу, а затем вставляет в нее записи из исходной таблицы. Вновь созданная таблица имеет ту же структуру, что и исходная таблица. Если вы попытаетесь использовать select into для существующей таблицы, она выдаст ошибку, потому что она попытается создать новую таблицу с тем же именем. Вставка в требует, чтобы таблица существовала в вашей базе данных, прежде чем вы вставляете в нее строки.
источник
Простая разница между select Into и Insert Into: -> Select Into не требует существующей таблицы. Если вы хотите скопировать данные таблицы A, вы просто набираете Select * INTO [tablename] из A. Здесь имя таблицы может быть существующей таблицей, или будет создана новая таблица, имеющая такую же структуру, как таблица A.
-> Вставить в существующую таблицу. ВСТАВИТЬ В [имя таблицы] ВЫБРАТЬ * ИЗ A ;. Здесь tablename - существующая таблица.
Select Into обычно более популярен для копирования данных, особенно данных резервного копирования.
Вы можете использовать в соответствии с вашими требованиями, это полностью выбор разработчика, который должен использоваться в его сценарии.
Мудрая производительность Insert INTO работает быстро.
Ссылки :
https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp
источник
Выбор для больших наборов данных может быть полезен только для одного пользователя, использующего одно единственное подключение к базе данных, выполняющего задачу массовой операции. Не рекомендую использовать
поскольку это создает одну большую транзакцию и блокировку схемы для создания объекта, не позволяя другим пользователям создавать объект или получать доступ к системным объектам до завершения
SELECT INTO
операции.В качестве доказательства концепции откройте 2 сеанса, в первом сеансе попробуйте использовать
а во втором разделе попробуйте
и проверьте блокировки, блокировки и продолжительность второго сеанса, чтобы создать объект временной таблицы. Я рекомендую всегда создавать и вставлять инструкцию, а при необходимости для минимальной регистрации используйте флаг трассировки 610.
источник