Ya, ada perbedaan performa yang cukup besar antara:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
dan
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);
Fakta bahwa setiap insert
pernyataan memiliki transaksi implisit sendiri menjamin ini. Anda dapat membuktikannya sendiri dengan mudah dengan melihat rencana eksekusi untuk setiap pernyataan atau dengan mengatur waktu eksekusi menggunakan set statistics time on;
. Ada biaya tetap yang terkait dengan "menyiapkan" dan "meruntuhkan" konteks untuk setiap sisipan individu dan kueri kedua harus membayar penalti ini lima kali sedangkan yang pertama hanya membayarnya sekali.
Tidak hanya metode daftar yang lebih efisien tetapi Anda juga dapat menggunakannya untuk membuat tabel turunan:
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
Format ini mengatasi batasan nilai 1.000 dan memungkinkan Anda untuk bergabung dan memfilter daftar Anda sebelum dimasukkan. Orang mungkin juga memperhatikan bahwa kita tidak terikat pada insert
pernyataan sama sekali! Sebagai tabel de facto, konstruk ini dapat digunakan di mana saja referensi tabel akan valid.