はい、次の間にかなり大きなパフォーマンスの違いがあります:
declare @numbers table (n int not null primary key clustered);
insert into @numbers (n)
values (0)
, (1)
, (2)
, (3)
, (4);
および
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);
すべてのinsert
という事実 ステートメントには独自の暗黙のトランザクションがあり、これを保証します。各ステートメントの実行プランを表示するか、set statistics time on;
を使用して実行のタイミングを調整することで、簡単に証明できます。 。個々の挿入ごとにコンテキストの「設定」と「破棄」に関連する固定費があり、2番目のクエリはこのペナルティを5回支払う必要がありますが、最初のクエリは1回だけ支払います。
listメソッドはより効率的であるだけでなく、派生テーブルを作成するためにも使用できます。
select *
from (values
(0)
, (1)
, (2)
, (3)
, (4)
) as Numbers (n);
この形式では、値の制限が1,000前後になり、リストを挿入する前に、リストに参加してフィルタリングすることができます。 insert
に縛られていないことに気付くかもしれません。 まったく声明!事実上のテーブルとして、この構成はテーブル参照が有効な場所であればどこでも使用できます。