sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er fordelene ved at bruge Row Constructor-syntaksen i en T-Sql-indsættelsessætning?

Ja, der er en ret stor ydelsesforskel mellem:

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

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

og

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

Det faktum, at hver enkelt insert erklæringen har sin egen implicitte transaktion garanterer dette. Du kan nemt bevise det for dig selv ved at se eksekveringsplanerne for hver erklæring eller ved at time henrettelserne ved at bruge set statistics time on; . Der er en fast omkostning forbundet med at "opsætte" og "nedrive" konteksten for hvert enkelt indstik, og den anden forespørgsel skal betale denne bøde fem gange, mens den første kun betaler den én gang.

Ikke kun er listemetoden mere effektiv, men du kan også bruge den til at bygge en afledt tabel:

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

Dette format kommer omkring begrænsningen på 1.000 værdier og giver dig mulighed for at deltage og filtrere din liste, før den indsættes. Man kan også bemærke, at vi ikke er bundet til insert udsagn overhovedet! Som en de facto tabel kan denne konstruktion bruges overalt, hvor en tabelreference er gyldig.



  1. SCD Type 3

  2. Cast eller udtræk tidsstempel fra v1 UUID i PostgreSQL

  3. Hvordan konverteres streng til unicode ved hjælp af PostgreSQL?

  4. Forespørgsel for at få samlede ordrer afgivet af en bestemt kunde i sidste år henter gentagne datoer, hvor der ikke eksisterer nogen ordre