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'
Предполагая, конечно, что типы данных соответствуют таблице надлежащим образом ...


Похоже, ты просто имитируешь
INSERT into SOMETABLE
(
SELECT * FROM SOMEOTHERTABLE
)
Думаю, исходя из этого вопроса, вы подошли к преждевременная оптимизация. Я бы придерживался стандартных значений insert () values (), если вы просто вставляете 1 запись и позволяете команде Sql Server сделать ее наиболее производительной.
На самом деле я не оптимизирую преждевременно. Я вообще не оптимизирую, мне просто было любопытно на базовом уровне по поводу производительности, которая во всех случаях оказывается незначительной разницей.
точно, что является доработанной оптимизацией.
Будь осторожен, заявляя, что кто-то занимается преждевременной оптимизацией, поскольку многие программисты знают, что этого следует (соответственно) избегать. Я нашел этот вопрос, потому что меня интересовало, есть ли разница, но я хочу знать, потому что я нахожу синтаксис INSERT ... SELECT ... намного более ясным, потому что я могу использовать псевдоним для каждого столбца, чтобы запрос был самодокументированным (т. Е. Я могу легко узнать, какие значения вставляются в определенные столбцы). Это не преждевременная оптимизация; это просто хорошая практика кодирования!
Вопрос не в этом, вопрос в том, «что лучше» для ОДНОЙ вставки. И вы можете достичь того же уровня кодирования, используя комментарии или параметры по сравнению с оператором select, и сделать его столь же описательным.
Я подозреваю, что если бы была разница в производительности, она была бы в пользу первого, хотя я сомневаюсь, что она есть.
Тем не менее, это один из тех случаев, когда выбор более ясной версии (т.е. с VALUES) обеспечивает удобство чтения и ремонтопригодность, которые перевешивают вероятное незначительное влияние на производительность. Если вы указываете все значения, придерживайтесь обычного соглашения на случай, если кто-то еще прочитает код, который на первый взгляд может показаться выполнением INSERT ... SELECT из другой таблицы, что вводит в заблуждение.
Я не уверен, что согласен. Скажем, я делаю вставку из приложения C#. Этот запрос будет использоваться снова и снова с вложенными в него значениями. Тем, кто обслуживает мой код, вероятно, легче понять третью версию, чем версию Valuse ().
theo: Вы, конечно, правы; Я хотел сказать, что придерживайтесь того, что является самым чистым, ясным и читаемым, что может варьироваться от ситуации к ситуации.
игнорируйте этот комментарий, это неправильно. прости за это :(
Я знаю, что вы не можете использовать INSERT VALUES (), когда вводите более одной строки.
ВСТАВИТЬ В таблицу ВЫБРАТЬ 1, 2, 3, (ВЫБРАТЬ 4 ИЗ ТАБЛИЦЫ 2, ГДЕ столбецA = столбецB)
Верно ли это для SQL-сервера? другие СУБД позволяют делать это: ВСТАВЛЯТЬ значения таблицы ('a1', 'a2'), ('b1', 'b2');
@Miles: Неверно. Стандартный SQL и большинство его реализаций поддерживают INSERT с более чем одной строкой.
моя проблема, я думал, что у меня был правильный синтаксис, когда я пробовал раньше, и я не мог заставить его работать ...: * (
Я только что это проверил.
5 миллионов итераций обоих подходов на двух наборах оборудования: один - сервер с 16 ГБ ОЗУ, второй - ноутбук с 1 ГБ.
Результат: они выглядят одинаково.
Планы запросов для них одинаковы, а разница в производительности статистически незначима.
Для SQL Server просто используйте этот шаблон
ВСТАВИТЬ имя таблицы (список полей) ВЫБРАТЬ (valueList / columnList) [ОТ и так далее]
Это единственный шаблон вставки, который вам когда-либо понадобится. Он все делает. Укажите список полей, чтобы защитить ваш оператор от будущих изменений таблицы (где добавляются необязательные столбцы).
Есть некоторые незначительные нюансы использования INSERT INTO VALUES, которые я не помню, потому что мне это не нужно.
Синтаксис SELECT без предложения FROM отличается от стандартного SQL. Некоторые бренды поддерживают его, но не все.
Я согласен, что это преждевременная оптимизация. Есть так много других более важных проблем с производительностью. Однако, если проблема заключается в массовой загрузке большого количества строк, часто лучше использовать специфичную для поставщика функцию, такую как MySQL LOAD DATA INFILE, потому что они работают намного лучше.