Odpowiedzi na to pytanie dotąd były bardzo mylący (i wykazują kompletny brak wysiłku/zrozumienia), a tam jest dość duża różnica wydajności pomię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żde oświadczenie insert
ma swoją własną transakcję niejawną, gwarantuje to. Możesz to łatwo udowodnić, przeglądając plany wykonania dla każdej instrukcji lub wykonując czas wykonania egzaminu przy użyciu set statistics time on;
. Istnieje stały koszt związany z "ustawieniem" i "zerwaniem" kontekstu dla każdego pojedynczego wkładu, a drugie zapytanie musi zapłacić tę karę pięć razy, podczas gdy pierwsza płaci tylko raz.
Nie tylko jest metoda lista bardziej wydajne, ale można też użyć go do budowy tabelę pochodzącą:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Format ten omija ograniczenia 1000 wartości i pozwala połączyć i filtrować listę przed nim jest wstawiony. Można również zauważyć, że w ogóle nie jesteśmy zobowiązani do oświadczenia insert
! Jako de facto tabela, ta konstrukcja może być używana wszędzie tam, gdzie odniesienie do tabeli byłoby poprawne.
W rzeczywistości może być znacząca korzyść z wydajności, jeśli duża liczba pojedynczych instrukcji INSERT zostanie wysłana przez połączenie sieciowe. Zobacz [moja odpowiedź tutaj] (http://stackoverflow.com/a/25879264/2144390) na przykład. –