質問: Common Table Expression(CTE)と一時テーブルの違いは何ですか?そして、いつ私はもう一方を使うべきですか? **CTE** ``` WITH cte (Column1, Column2, Column3) AS ( SELECT Column1, Column2, Column3 FROM SomeTable ) SELECT * FROM cte ``` **温度テーブル** ``` SELECT Column1, Column2, Column3 INTO #tmpTable FROM SomeTable SELECT * FROM #tmpTable ```
回答: これはかなり広いですが、私はできる限り一般的な答えをします。 **CTE ...** * 索引付けできません(ただし、参照されているオブジェクトに対して既存の索引を使用できます)。 * 制約を持つことはできません * 基本的に使い捨てです`VIEW` s * 次のクエリが実行されるまでだけ持続する * 再帰的にできます * 専用の統計を持っていない(基礎となるオブジェクトの統計に頼る) **#テーブルを一時保存...** * tempdbに存在する実際のマテリアライズ表です。 * 索引を付けることができます * 制約を持つことができます * 現在のCONNECTIONの存続期間中持続する * 他のクエリまたはサブプロシージャから参照可能 * エンジンによって生成された専用の統計を持っている それぞれを使用する場合に限り、それらは非常に異なるユースケースを持っています。非常に大きな結果セットがある場合、またはそれを複数回参照する必要がある場合は、 `#temp`表に入れてください。再帰的である必要がある場合、使い捨て可能な場合、または論理的に何かを単純化するためだけの場合は、 `CTE`が推奨されます。 また、 `CTE`**パフォーマンスに決して使われない**。CTEを使用しても処理速度が向上することはほとんどありません。これもまた、単なる使い捨てのビューだからです。あなたは彼らといくつかのきちんとしたことをすることができますが、クエリを高速化することは本当にそれらの一つではありません。