11

CTEはtempdb内のスペースを使用するのですか、それともメモリを排他的に使用しますか?CTEはtempdb内の任意のスペースを使用しますか?

私は両方を使用するので、mssql 2005と2008の両方で質問にタグ付けしました。

+0

クエリは、に必ず記載されています。これについては、「クエリーで必要なスペース」も参照してください。 –

答えて

11

コピー/貼り付けをしないでください。

問題ではありません。

CTEはクエリの実行とは無関係です。これは言語構造にすぎません。純粋な派生テーブルまたはサブクエリと考えることができます。

これは、再帰的なCTE(後で参照)を除いて、すべてのCTEをインラインでコーディングできることを意味します。一度CTEコードを使用すると、の可読性がになります。 CTEを2回以上使用すると、防御的です。間違いを犯さずに、派生テーブルを使い分けることができます。

CTEが2回以上使用される場合、そのコードは2回以上実行されます。これは一度実行されず、tempdbにキャッシュされます。

要約:コードがインラインであったかのように、そうでなくてもかまいません。

注:再帰CTEは、derの内部の派生テーブル内の派生テーブル内の派生テーブル内の派生テーブルです。同様に適用されます。

Tony Rogerson's articleでこれを見ることができます。 tempdbの使用は、インラインでコード化されていればとにかく起こります。彼はまた、私が上に説明した "マクロ"拡張のために、テンポラリテーブルを使う方が良いかもしれないことに注意します。

FYI:同じことがビューに適用されます。ただのマクロ。

+0

+1コピー/ペーストの回答がない場合。 –

7

共通表式は、一時的な結果は、単一のSELECT、INSERT、UPDATE の実行範囲内で定義され を設定するようにDELETE、考える、またはCREATE VIEWステートメントすることができます。 共通テーブル式クエリのクエリプランでスプール演算子を使用して の中間クエリ結果を保存すると、tempdbに作業テーブル が作成され、この操作をサポートします。 MSDNから

source

4

http://msdn.microsoft.com/en-us/library/ms345368.aspx

共通表式は、DELETE、単一のSELECT、INSERT、UPDATEの実行範囲内で定義された一時的な結果セットと考えることができ、またはCREATE VIEWステートメント。

一般的なテーブル式クエリのクエリプランでスプール演算子を使用して中間クエリ結果を保存すると、データベースエンジンはこの操作をサポートするためにtempdbに作業テーブルを作成します。

関連する問題