Tak, istnieje dość duża różnica w wydajności między:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
i
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);
Fakt, że każdy insert
oświadczenie ma swoją własną niejawną transakcję, która to gwarantuje. Możesz to łatwo udowodnić, przeglądając plany wykonania dla każdej instrukcji lub mierząc czas wykonania przy użyciu set statistics time on;
. Istnieje stały koszt związany z „konfiguracją” i „zrywaniem” kontekstu dla każdej pojedynczej wstawki, a drugie zapytanie musi zapłacić tę karę pięć razy, podczas gdy pierwsze płaci ją tylko raz.
Metoda list jest nie tylko bardziej wydajna, ale można jej również użyć do zbudowania tabeli pochodnej:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Ten format ma około 1000 wartości i umożliwia dołączanie i filtrowanie listy przed jej wstawieniem. Można również zauważyć, że nie jesteśmy przywiązani do insert
w ogóle oświadczenie! Jako de facto tabela ta konstrukcja może być używana wszędzie tam, gdzie odwołanie do tabeli byłoby poprawne.