Вставить в: один синтаксис более оптимален или предпочтительнее?

SQL Server (2005/2008)

Все приведенные ниже утверждения имеют одинаковый результат. Кто-нибудь знает, превосходит ли один другой?

insert into SOMETABLE 
  values ('FieldOneValue','FieldTwoValue',3,4.55,'10/10/2008 16:42:00.000')

insert into SOMETABLE 
  select 'FieldOneValue','FieldTwoValue',3,4.55,'10/10/2008 16:42:00.000'

insert into SOMETALBE
  Select
    Field1 = 'FieldOneValue',
    Field2 = 'FieldTwoValue',
    Field3 = 3,
    Field4 = 4.55,
    Field5 = '10/10/2008 16:42:00.000'

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
1 171
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Похоже, ты просто имитируешь

INSERT into SOMETABLE
(
SELECT * FROM SOMEOTHERTABLE
)

Думаю, исходя из этого вопроса, вы подошли к преждевременная оптимизация. Я бы придерживался стандартных значений insert () values ​​(), если вы просто вставляете 1 запись и позволяете команде Sql Server сделать ее наиболее производительной.

Я согласен, что это преждевременная оптимизация. Есть так много других более важных проблем с производительностью. Однако, если проблема заключается в массовой загрузке большого количества строк, часто лучше использовать специфичную для поставщика функцию, такую ​​как MySQL LOAD DATA INFILE, потому что они работают намного лучше.

Bill Karwin 11.10.2008 05:09

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

theo 11.10.2008 19:16

точно, что является доработанной оптимизацией.

Darren Kopp 11.10.2008 23:28

Будь осторожен, заявляя, что кто-то занимается преждевременной оптимизацией, поскольку многие программисты знают, что этого следует (соответственно) избегать. Я нашел этот вопрос, потому что меня интересовало, есть ли разница, но я хочу знать, потому что я нахожу синтаксис INSERT ... SELECT ... намного более ясным, потому что я могу использовать псевдоним для каждого столбца, чтобы запрос был самодокументированным (т. Е. Я могу легко узнать, какие значения вставляются в определенные столбцы). Это не преждевременная оптимизация; это просто хорошая практика кодирования!

Kenny Evitt 18.06.2012 20:44

Вопрос не в этом, вопрос в том, «что лучше» для ОДНОЙ вставки. И вы можете достичь того же уровня кодирования, используя комментарии или параметры по сравнению с оператором select, и сделать его столь же описательным.

Darren Kopp 19.06.2012 05:59

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

Тем не менее, это один из тех случаев, когда выбор более ясной версии (т.е. с VALUES) обеспечивает удобство чтения и ремонтопригодность, которые перевешивают вероятное незначительное влияние на производительность. Если вы указываете все значения, придерживайтесь обычного соглашения на случай, если кто-то еще прочитает код, который на первый взгляд может показаться выполнением INSERT ... SELECT из другой таблицы, что вводит в заблуждение.

Я не уверен, что согласен. Скажем, я делаю вставку из приложения C#. Этот запрос будет использоваться снова и снова с вложенными в него значениями. Тем, кто обслуживает мой код, вероятно, легче понять третью версию, чем версию Valuse ().

theo 11.10.2008 19:18

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

Rob 27.10.2008 06:13

игнорируйте этот комментарий, это неправильно. прости за это :(

Я знаю, что вы не можете использовать INSERT VALUES (), когда вводите более одной строки.

ВСТАВИТЬ В таблицу ВЫБРАТЬ 1, 2, 3, (ВЫБРАТЬ 4 ИЗ ТАБЛИЦЫ 2, ГДЕ столбецA = столбецB)

Верно ли это для SQL-сервера? другие СУБД позволяют делать это: ВСТАВЛЯТЬ значения таблицы ('a1', 'a2'), ('b1', 'b2');

Draemon 11.10.2008 02:17

@Miles: Неверно. Стандартный SQL и большинство его реализаций поддерживают INSERT с более чем одной строкой.

Bill Karwin 11.10.2008 05:06

моя проблема, я думал, что у меня был правильный синтаксис, когда я пробовал раньше, и я не мог заставить его работать ...: * (

Miles 14.10.2008 19:15
Ответ принят как подходящий

Я только что это проверил.

5 миллионов итераций обоих подходов на двух наборах оборудования: один - сервер с 16 ГБ ОЗУ, второй - ноутбук с 1 ГБ.

Результат: они выглядят одинаково.

Планы запросов для них одинаковы, а разница в производительности статистически незначима.

Для SQL Server просто используйте этот шаблон

ВСТАВИТЬ имя таблицы (список полей) ВЫБРАТЬ (valueList / columnList) [ОТ и так далее]

Это единственный шаблон вставки, который вам когда-либо понадобится. Он все делает. Укажите список полей, чтобы защитить ваш оператор от будущих изменений таблицы (где добавляются необязательные столбцы).

Есть некоторые незначительные нюансы использования INSERT INTO VALUES, которые я не помню, потому что мне это не нужно.

Синтаксис SELECT без предложения FROM отличается от стандартного SQL. Некоторые бренды поддерживают его, но не все.

Bill Karwin 11.10.2008 05:07

Другие вопросы по теме