CTE
(共通テーブル式) と、どちらが速いですかTemp tables
?Table variables
3 に答える
コメントですでに言ったように:それは依存します!
それは実際には、クエリ、データ (どのくらいあるのか? それはどのようなものなのか??) などに依存します。
ただし、覚えておくべきいくつかの箇条書きがあります。
CTE は、次のステートメントに対してのみ有効な「インライン ビュー」です。可能であれば、SQL Server は一時的な結果をメモリに保持します。
一時テーブルには 2 つのフレーバーがあります。自分の接続のみに表示される
create table #temp
もの ( )、またはすべての接続にグローバルに表示されるもの (create table ##temp
) です。接続がそれらを使用しなくなった場合、両方とも自動ドロップされます。一時テーブルにインデックスを定義でき、それらはトランザクションの一部ですテーブル変数では、それらにインデックスを作成することはできず、トランザクショナル ダンスに参加することもできません。これには賛否両論がありますが、注意してください。A
ROLLBACK
は、テーブル変数に含まれるデータには影響しません....
http://royalarun.blogspot.in/2013/10/difference-between-cte-and-temp-table.html
SQL Server の CTE と一時テーブルおよびテーブル変数の違い
一時テーブルは、Tempdb データベースに物理的に作成されます。これらのテーブルは通常のテーブルとして機能し、通常のテーブルのように制約やインデックスを持つこともできます。これは、2 つのローカル一時テーブルとグローバル一時テーブルに分割されます。ローカル一時テーブルは、テーブルを作成した SQL Server セッションまたは接続 (シングル ユーザーを意味します) のみが使用できます。グローバル一時テーブルは、すべての SQL Server セッションまたは接続 (すべてのユーザーを意味します) で利用できます。これらは任意の SQL Server 接続ユーザーが作成でき、すべての SQL Server 接続が閉じられると自動的に削除されます。トランザクション ロールバックのサポートが必要な場合。
CTE - 共通テーブル式は、複雑なサブクエリ データを操作するために使用される名前付きの一時的な結果セットです。これは、ステートメントの範囲で存在します。これは、Tempdb データベースではなくメモリ内に作成されます。CTE にインデックスを作成することはできません。
テーブル変数は変数のように機能し、クエリ実行の特定のバッチのために存在します。バッチから出ると、自動的に削除されます。これは Tempdb データベースにも作成されますが、メモリには作成されません。インデックスがテーブルの PRIMARY KEY または UNIQUE 制約の副作用でない限り、テーブル変数に非クラスター化インデックスを作成することはできません。結果セットが小さい場合は、テーブル変数が常に最適な選択です。
ある特定のケースで CTE への移行速度が 50% 向上したため、試してみる価値はありますが、パフォーマンス関連の機能強化はすべてベンチ マークを付けて比較できるようにする必要があります。
PS: 現在使用しているクエリを取得する前に、CTE を含む複数のクエリを作成しました。