Да, има доста голяма разлика в производителността между:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
и
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n) values (0);
insert into @numbers (n) values (1);
insert into @numbers (n) values (2);
insert into @numbers (n) values (3);
insert into @numbers (n) values (4);
Фактът, че всеки един insert
изявлението има своя собствена имплицитна транзакция, която гарантира това. Можете лесно да го докажете на себе си, като прегледате плановете за изпълнение за всеки израз или като определите времето за изпълнение с помощта на set statistics time on;
. Има фиксирана цена, свързана с „настройването“ и „събарянето“ на контекста за всяко отделно вмъкване и втората заявка трябва да плати тази неустойка пет пъти, докато първата я плаща само веднъж.
Методът на списъка не само е по-ефективен, но можете също да го използвате за изграждане на производна таблица:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Този формат заобикаля ограничението от 1000 стойности и ви позволява да се присъедините и да филтрирате списъка си, преди да бъде вмъкнат. Може също така да забележите, че не сме обвързани с insert
изявление изобщо! Като de facto таблица, тази конструкция може да се използва навсякъде, където би била валидна препратка към таблица.