Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Welche Vorteile hat die Verwendung der Row Constructor-Syntax in einer T-Sql-Einfügeanweisung?

Ja, es gibt einen ziemlich großen Leistungsunterschied zwischen:

declare @numbers table (n int not null primary key clustered);

insert into @numbers (n)
values (0)
     , (1)
     , (2)
     , (3)
     , (4);

und

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);

Die Tatsache, dass jeder einzelne insert -Anweisung hat ihre eigene implizite Transaktion, die dies garantiert. Sie können es sich leicht selbst beweisen, indem Sie sich die Ausführungspläne für jede Anweisung ansehen oder die Ausführung mit set statistics time on; zeitlich festlegen . Mit dem „Einrichten“ und „Abreißen“ des Kontexts für jede einzelne Einfügung sind feste Kosten verbunden, und die zweite Abfrage muss diese Strafe fünfmal zahlen, während die erste sie nur einmal zahlt.

Die Listenmethode ist nicht nur effizienter, sondern Sie können sie auch zum Erstellen einer abgeleiteten Tabelle verwenden:

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

Dieses Format umgeht die Wertbeschränkung von 1.000 und ermöglicht es Ihnen, Ihre Liste zu verknüpfen und zu filtern, bevor sie eingefügt wird. Man könnte auch bemerken, dass wir nicht an insert gebunden sind Aussage überhaupt! Als De-facto-Tabelle kann dieses Konstrukt überall dort verwendet werden, wo eine Tabellenreferenz gültig wäre.