sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cuáles son los beneficios de usar la sintaxis de Row Constructor en una declaración de inserción de T-Sql?

Sí, hay una diferencia de rendimiento bastante grande 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 insert declaración tiene su propia transacción implícita garantiza esto. Puede comprobarlo usted mismo 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 "eliminar" el contexto para cada inserción individual y la segunda consulta debe pagar esta penalización cinco veces, mientras que la primera solo la paga una vez.

El método de lista no solo es más eficiente, sino que también puede usarlo para crear una tabla derivada:

select *
from (values
    (0)
  , (1)
  , (2)
  , (3)
  , (4)
) as Numbers (n);

Este formato sortea el límite de 1000 valores y le permite unirse y filtrar su lista antes de que se inserte. También se podría notar que no estamos obligados a insert declaración en absoluto! Como una tabla de facto, esta construcción se puede usar en cualquier lugar donde una referencia de tabla sea válida.