Ano, mezi:
je poměrně velký rozdíl ve výkonudeclare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
a
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);
Skutečnost, že každý jednotlivý insert
výpis má svou vlastní implicitní transakci, která to zaručuje. Můžete si to snadno dokázat zobrazením plánů provádění pro každý příkaz nebo načasováním provádění pomocí set statistics time on;
. S „nastavením“ a „rozbouráním“ kontextu pro každou jednotlivou vložku jsou spojeny fixní náklady a druhý dotaz musí tuto pokutu zaplatit pětkrát, zatímco první ji zaplatí pouze jednou.
Metoda seznamu je nejen efektivnější, ale můžete ji také použít k vytvoření odvozené tabulky:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Tento formát se pohybuje kolem limitu 1 000 hodnot a umožňuje se připojit a filtrovat seznam před jeho vložením. Možná si také všimnete, že nejsme vázáni na insert
prohlášení vůbec! Jako de facto tabulku lze tento konstrukt použít kdekoli, kde by byl platný odkaz na tabulku.