Ja, der er en ret stor ydelsesforskel mellem:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
og
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);
Det faktum, at hver enkelt insert
erklæringen har sin egen implicitte transaktion garanterer dette. Du kan nemt bevise det for dig selv ved at se eksekveringsplanerne for hver erklæring eller ved at time henrettelserne ved at bruge set statistics time on;
. Der er en fast omkostning forbundet med at "opsætte" og "nedrive" konteksten for hvert enkelt indstik, og den anden forespørgsel skal betale denne bøde fem gange, mens den første kun betaler den én gang.
Ikke kun er listemetoden mere effektiv, men du kan også bruge den til at bygge en afledt tabel:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Dette format kommer omkring begrænsningen på 1.000 værdier og giver dig mulighed for at deltage og filtrere din liste, før den indsættes. Man kan også bemærke, at vi ikke er bundet til insert
udsagn overhovedet! Som en de facto tabel kan denne konstruktion bruges overalt, hvor en tabelreference er gyldig.