sql >> Database >  >> RDS >> Sqlserver

Wat zijn de voordelen van het gebruik van de Row Constructor-syntaxis in een T-Sql-invoeginstructie?

Ja, er is een vrij groot prestatieverschil tussen:

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

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

en

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

Het feit dat elke afzonderlijke insert verklaring heeft zijn eigen impliciete transactie garandeert dit. Je kunt het jezelf gemakkelijk bewijzen door de uitvoeringsplannen voor elke instructie te bekijken of door de uitvoeringen te timen met behulp van set statistics time on; . Er zijn vaste kosten verbonden aan het "opzetten" en "afbreken" van de context voor elke afzonderlijke invoeging en de tweede zoekopdracht moet deze boete vijf keer betalen, terwijl de eerste deze slechts één keer betaalt.

De lijstmethode is niet alleen efficiënter, maar u kunt deze ook gebruiken om een ​​afgeleide tabel te maken:

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

Deze indeling komt rond de limiet van 1000 waarden en stelt u in staat om deel te nemen en uw lijst te filteren voordat deze wordt ingevoegd. Je zou ook kunnen opmerken dat we niet gebonden zijn aan de insert verklaring helemaal! Als een feitelijke tabel kan deze constructie overal worden gebruikt waar een tabelreferentie geldig zou zijn.



  1. Ik krijg INSERT niet aan het werk

  2. Mysql-bestelling door twee kolommen te gebruiken

  3. Hoe een kolom wijzigen en de standaardwaarde wijzigen?

  4. Hoe de waarden van de NLS-parameters in Oracle Database te controleren?