ВСТАВЛЯЄТЬСЯ НА ВИБІР ВИБОР


127

Яка різниця між використанням

SELECT ... INTO MyTable FROM...

і

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

?

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

  1. Яке твердження є кращим?
  2. Чи є інші наслідки для продуктивності?
  3. Який вигідний варіант використання SELECT ... INTO over INSERT INTO ...?

Редагувати: Я вже заявив, що знаю, що SELECT INTO ... створює таблицю там, де її немає. Що я хочу знати, це те, що SQL включає цю заяву чомусь, що це? Це робиться щось інше за лаштунками для вставки рядків, чи це просто синтаксичний цукор поверх а CREATE TABLEта INSERT INTO.


Один невеликий фактор: INSERT INTOмає дві ключові слова (виберіть і введіть) прямо вперед, які повідомляють світові, що це не звичайний оператор SQL, а SELECT ... INTOпринаймні починає виглядати як звичайний оператор SQL. Невелика причина віддати перевагу першим.
Мартін Ф

Відповіді:


122
  1. Вони роблять різні речі. Використовуйте, INSERTколи існує таблиця. Використовуйте, SELECT INTOколи цього немає.

  2. Так. INSERTбез підказки таблиці, як правило, реєструється. SELECT INTOмінімально зареєстрований, якщо припустимо встановити правильні прапори слідів.

  3. На мій досвід SELECT INTOнайчастіше використовується з проміжними наборами даних, як-от #tempтаблиці, або для копіювання цілої таблиці, як для резервної копії. INSERT INTOвикористовується, коли ви вставляєте в існуючу таблицю з відомою структурою.

EDIT

Щоб звернутися до вашої редакції, вони роблять різні речі. Якщо ви створюєте таблицю і хочете визначити структуру використання CREATE TABLEта INSERT. Приклад проблеми, яку можна створити: у вас маленька таблиця з полем варшара. Найбільший рядок вашої таблиці зараз - 12 байт. Ваш реальний набір даних потребуватиме до 200 байт. Якщо ви зробите SELECT INTOз своєї маленької таблиці, щоб створити нову, пізніша INSERTпомилка не буде, оскільки ваші поля занадто малі.


4
Мої два центи, я думаю, що введення невдач - це гарна річ. Я хочу знати, чи мої дані не відповідають очікуваному формату / розміру даних. Я завжди намагаюся визначити свою таблицю за допомогою, CREATE TABLEі тоді INSERT INTOтакож простіше перевірити SELECTоператор самостійно, не виконуючи вставки.
Дуг Чемберлен

1
@Doug - я згоден. Я майже виключно використовую SELECT INTOдля створення темп-таблиці або для швидкого резервного копіювання існуючої таблиці, з якою я збираюся маніпулювати.
JNK

1
@JNK - З BOL SELECT INTO створює таблицю зі структурою на основі типів даних стовпців у списку вибору. Тож у вашому прикладі ви могли б виправити ситуацію, чітко відкинувши варчар до розміру, який був би достатнім. Правильно?
jowenece

2
@Jowenece - так, я так очікую. Якщо я зіткнуся з цією проблемою, я все ж таки буду використовувати CREATEзаяву.
JNK

24
  1. Яке твердження є кращим? Залежить від того, що ти робиш.

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

  3. Який вигідний варіант використання SELECT ... INTO over INSERT INTO ...? Вибрати в використовується, якщо ви, можливо, не знаєте структури таблиці заздалегідь. Писати швидше, ніж створювати таблицю та оператор вставки, тому він використовується для прискорення розробки в рази. Це часто швидше використовувати, коли ви створюєте швидку таблицю темпів для тестування речей або резервної таблиці певного запиту (можливо, записи, які ви збираєтеся видалити). Потрібно рідко бачити його, що використовується у виробничому коді, який буде працювати декілька разів (за винятком тимчасових таблиць), оскільки він вийде з ладу, якщо таблиця вже була.

Іноді його використовують неналежно люди, які не знають, що роблять. І в результаті вони можуть спричинити хаос. Я настійно вважаю, що невірно використовувати SELECT INTO для чогось іншого, крім таблиці, що викидається (тимчасова резервна копія, тимчасова таблиця, яка піде в кінці збереженої програми тощо). Постійні таблиці потребують реальної роздуми щодо їх дизайну, а SELECT INTO дозволяє легко не думати про що-небудь навіть таке базове, як колони та які типи даних.

Взагалі я віддаю перевагу використанню таблиці створення та вкладенню оператора - у вас більше елементів керування, і це краще для повторюваних процесів. Далі, якщо таблиця є постійною таблицею, вона повинна бути створена з окремого скрипта створення таблиці (такий, який знаходиться в контролі джерела), оскільки створення постійних об'єктів, як правило, не має в коді вставляти / видаляти / оновлювати або вибирати з стіл. Зміни об'єкта слід обробляти окремо від змін даних, оскільки об'єкти мають наслідки, що перевищують потреби певного вставки / оновлення / вибору / видалення. Вам потрібно розглянути найкращі типи даних, продумати обмеження FK, ПК та інші обмеження, розглянути вимоги до аудиту, продумати індексацію тощо.


5

Основна відмінність полягає в тому, що 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, оскільки він значно спрощує завдання, такі як спеціальні звіти або копіювання таблиць.


СТВОРИТИ ТАБЛИЦЮ та ВИБІРТЬ ІНТО - це одне і те ж (не потрібно ВСТАВИТЬ ІНТО в якості доповнення для виконання того, що робить SELECT INTO), і SELECT INTO не рекомендується. Дивіться dba.stackexchange.com/questions/156105/… .
Рік

4

Кожен вислів має виразний випадок використання. Вони не взаємозамінні.

SELECT...INTO MyTable...створює нове, MyTableде такого раніше не існувало.

INSERT INTO MyTable...SELECT...використовується, коли MyTableвже існує.


4
Ви не відповіли на жодне моє запитання, і я вже заявив вашу відповідь.
jowenece

5
Відповіді на ваші запитання маються на увазі. Щоб було зрозуміліше, немає "кращого" твердження, оскільки кожен має чіткий випадок використання. Твердження не є взаємозамінними. Використовуйте першу версію, коли ви хочете створити нову таблицю, яка не існує. Використовуйте другу версію, коли таблиця вже існує.
Джо Стефанеллі

2
Чому я б хотів це зробити, створюючи тимчасову таблицю, а потім вставляючи її? Чи є перевага?
jowenece

4

Насправді ВИБІРТЕ ... ДО не тільки створює таблицю, але й виходить з ладу, якщо вона вже існує, тому в основному єдиний раз, коли ви її використовували б, коли таблиця, яку ви вставляєте, не існує.

Що стосується вашого редагування:

Я особисто в основному використовую SELECT ... INTO, коли я створюю темп-таблицю. Це для мене головне використання. Однак я також використовую його для створення нових таблиць з багатьма стовпцями з подібними структурами до інших таблиць, а потім редагую їх, щоб заощадити час.


1
В основному я бачу використання SELECT..INTO для тимчасових таблиць, але чи є причина віддати перевагу над створенням тимчасової таблиці з CREATE TABLE оператором? Наприклад - підвищення продуктивності?
jowenece

3
@jowenece Я думаю, що в основному для простоти ... Також скажіть, що у вас є динамічний запит. Я не знаю структури, ви не можете створити таблицю перед рукою, і її набагато простіше використовувати SELECT ... INTO, ніж створити таблицю динамічно.
AJC

3

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

Щоденний код ви використовуєте INSERT, оскільки ваші таблиці вже повинні існувати для читання, UPDATEd, DELETEd, JOINed тощо. Примітка. Ключове слово INTO необов'язково для INSERT

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

Таблиця, створена SELECT INTO, не матиме ключів чи індексів чи обмежень на відміну від реальної, збереженої, вже існуючої таблиці

Ці 2 безпосередньо не порівнянні, оскільки вони майже не перетинаються у використанні


2

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


Це правда, але це здебільшого тому, що SQL Server знає, що для таблиці призначення немає суперечок. Виступ для insert into #temp with(tablock) select * from ..приблизно такий же, як і дляselect * into #temp from ...
Брайан

1

Виберіть "Створити" створює для вас нову таблицю в той час, а потім вставити в неї записи з вихідної таблиці. Новостворена таблиця має таку ж структуру, що і для вихідної таблиці. Якщо ви спробуєте використати select в для існуючої таблиці, вона призведе до помилки, оскільки вона спробує створити нову таблицю з тим же ім'ям. Вставити в вимагає існування таблиці у вашій базі даних, перш ніж вставляти в неї рядки.


1

Проста різниця між вибором Into та Insert Into полягає в наступному: -> Select Into не потрібна існуюча таблиця. Якщо ви хочете скопіювати дані таблиці A, просто введіть Select * INTO [ім'я таблиці] з A. Тут може бути існуюча таблиця, або буде створена нова таблиця, яка має таку ж структуру, як таблиця A.

-> Insert Into потребує існуючої table.INSERT INTO [ім'я таблиці] SELECT * FROM A ;. Тут ім'я таблиці - це вже наявна таблиця.

Вибір Into зазвичай популярніший для копіювання даних, особливо резервних даних.

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

Ефективність Insert INTO - це швидко.

Список літератури:

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


-2

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

SELECT * INTO table

оскільки це створює одну велику транзакцію і створює блокування схеми для створення об'єкта, заважаючи іншим користувачам створювати об'єкти або отримувати доступ до системних об'єктів до SELECT INTO операції.

Як доказ концепції відкрийте 2 сеанси, в першій сесії спробуйте використовувати

select into temp table from a huge table 

а у другому розділі спробуйте

create a temp table 

і перевірити блокування, блокування та тривалість другого сеансу, щоб створити об’єкт темп-таблиці. Моя рекомендація: це завжди є хорошою практикою створювати та вставляти оператор, і якщо це потрібно для мінімального журналу, використовуйте прапор 610 сліду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.