13

CTE は tempdb のスペースを使用しますか? それともメモリのみを使用しますか?

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

4

3 に答える 3

13

MSDN をコピーして貼り付けないようにします

それは問題ではありません。

CTE はクエリの実行とは無関係です。これは単なる言語構造です。それはきちんとした派生テーブルまたはサブクエリと考えてください。

これは、再帰的な CTE (後述) を除いて、すべてのCTE をインラインでコーディングできることを意味します。CTE コードを一度使用すると、読みやすくなります。CTE を 2 回以上使用する場合は防御的です。間違いを犯して、使用するたびに異なる派生テーブルを作成することは望ましくありません。

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

要約: コードがインラインであるかのように、そうかもしれないし、そうでないかもしれません。

注: 再帰 CTE は、単純に、der 内の派生テーブル内の派生テーブル内の派生テーブル内の派生テーブルです...同じことが当てはまります。

これは、Tony Rogerson の記事で確認できます。インラインでコーディングされている場合、tempdb の使用はいずれにせよ発生します。彼はまた、私が上で説明した「マクロ」拡張のために、一時テーブルを使用する方が良い可能性があると述べています

参考までに、同じことがビューにも当てはまります。マクロばかり。

于 2011-10-18T03:41:52.177 に答える
11

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

ソース

于 2011-10-18T03:03:09.113 に答える
5

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

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

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

于 2011-10-18T03:03:31.630 に答える