Las respuestas a esta pregunta hasta ahora han sido extremadamente engañosa (y demostrar una completa falta de esfuerzo/comprensión) ya que hay una diferencia bastante grande rendimiento entre:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
y
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);
El hecho de que cada declaración insert
tiene su propia transacción implícita garantiza esto. Puede probarlo fácilmente viendo los planes de ejecución para cada declaración o cronometrando las ejecuciones usando set statistics time on;
. Hay un costo fijo asociado con "configurar" y "derribar" el contexto para cada inserción individual y la segunda consulta tiene que pagar esta penalización cinco veces, mientras que la primera solo paga una vez.
No sólo es el método de la lista más eficiente pero también se puede utilizar para construir una tabla derivada:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Este formato se pone alrededor de la limitación 1.000 de valor y le permite unirse y filtrar la lista antes de que se está insertado. ¡Uno también podría notar que no estamos obligados a la declaración insert
en absoluto! Como una tabla de facto, esta construcción se puede usar en cualquier lugar donde una referencia de tabla sea válida.
En realidad, puede haber un beneficio de rendimiento significativo si se envía una gran cantidad de instrucciones INSERT individuales a través de una conexión de red. Ver [mi respuesta aquí] (http://stackoverflow.com/a/25879264/2144390) para un ejemplo. –