Oui, il existe une différence de performances assez importante entre :
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
et
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);
Le fait que chaque insert
déclaration a sa propre transaction implicite garantit cela. Vous pouvez vous le prouver facilement en affichant les plans d'exécution de chaque instruction ou en chronométrant les exécutions à l'aide de set statistics time on;
. Il y a un coût fixe associé à la "configuration" et au "démantèlement" du contexte pour chaque insertion individuelle et la deuxième requête doit payer cette pénalité cinq fois tandis que la première ne la paie qu'une seule fois.
Non seulement la méthode de liste est plus efficace, mais vous pouvez également l'utiliser pour créer une table dérivée :
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Ce format contourne la limite de 1 000 valeurs et vous permet de joindre et de filtrer votre liste avant qu'elle ne soit insérée. On peut également remarquer que nous ne sommes pas liés au insert
déclaration du tout! En tant que table de facto, cette construction peut être utilisée partout où une référence de table serait valide.