Sim, há uma diferença de desempenho bastante grande entre:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
e
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);
O fato de que cada
insert
declaração tem sua própria transação implícita garante isso. Você pode provar isso facilmente visualizando os planos de execução para cada instrução ou cronometrando as execuções usando set statistics time on;
. Há um custo fixo associado à "configuração" e "desmontagem" do contexto para cada inserção individual e a segunda consulta deve pagar essa penalidade cinco vezes, enquanto a primeira paga apenas uma vez. Não só o método de lista é mais eficiente, mas você também pode usá-lo para construir uma tabela derivada:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Esse formato fica em torno da limitação de 1.000 valores e permite que você junte e filtre sua lista antes que ela seja inserida. Pode-se notar também que não estamos vinculados ao
insert
declaração em tudo! Como uma tabela de fato, essa construção pode ser usada em qualquer lugar em que uma referência de tabela seja válida.