CTEは一時テーブルよりも優れていますか?

質問者:Elisete Marabe |最終更新日:2020年6月16日
カテゴリ:テクノロジーおよびコンピューティングデータベース
4.4 / 5 (147ビュー。42投票)
それぞれに数百万行のレコードがある複数のテーブルを結合している場合、 CTEのパフォーマンス一時テーブルよりも大幅に低下します。一時テーブルは常にディスク上にあります。CTEをメモリに保持できる限り、おそらくより高速になります(テーブル変数のように)。

また、質問は、CTEまたは一時テーブルのどちらが優れているかということです。

この最大の違いは、 CTEは現在のクエリスコープでのみ使用できるのに対し、一時テーブルまたはテーブル変数はセッションの全期間にわたって存在できるため、それらに対してさまざまなDML操作を実行できることです。以下は、各テストクエリタイプのT-SQLです。

続いて、質問は、CTEとサブクエリのどちらが優れているかということです。 CTEとサブクエリはどちらもほぼ同じパフォーマンスと機能を備えています。 CTEには、 CTEで再帰を使用できるという点で、サブクエリを使用するよりも優れています。 CTEを使用する最大の利点は、読みやすさです。 CTEは、同じ文のどこサブクエリができないように参照を複数回することができます。

その中で、CTEで一時テーブルを使用できますか?

あなたは非常に大きな結果セットを持っている、または複数回、それを参照する必要があります場合は一時テーブルは、#の一時テーブルに置きます。再帰的である必要がある場合、使い捨てである必要がある場合、または単に論理的に何かを単純化するためである場合は、 CTEが推奨されます。また、パフォーマンスのためにCTE使用しないでください。

CTEはパフォーマンスを改善しますか?

主な違いの1つは、オプティマイザ一時テーブルの統計を使用してクエリプランを確立できることです。これにより、パフォーマンスが向上する可能性があります。また、複数回使用される複雑なCTE (サブクエリ)がある場合は、それを一時テーブルに格納すると、パフォーマンスが向上することよくあります。

39関連する質問の回答が見つかりました

CTEにインデックスを付けることはできますか?

3つの答え。いいえ。CTEは一時的な「インライン」ビューです。このような構成にインデックスを追加することはできません。インデックス必要な場合、CTEのSELECTを使用して通常のビューを作成し、それをインデックス付きビューにします(ビューにクラスター化インデックスを追加することにより)。

ビューでCTEを使用できますか?

共通テーブル式は、短縮形ではCTEとも呼ばれ、SELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる一時的な名前付き結果セットです。 CTEはビューでも使用できます。この記事では、我々は我々のSQL ServerからのCTEを作成して使用する方法について詳細に表示されます

SQLでCTEが使用されるのはなぜですか?

CTEは、派生テーブルが適切ではなかったさまざまなクラスのSQLクエリを単純化するために標準SQLに導入されました。 SQL Server 2005で導入された共通テーブル式( CTE )は、SELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる一時的な名前付き結果セットです。

一時テーブルに対するテーブル変数の利点は何ですか?

一時テーブルに対するテーブル変数の利点の1つは、テーブル変数が関数、ストアドプロシージャ、またはそれらが定義されているバッチの最後に自動的にクリーンアップされるのに対し、一時テーブルは削除することを忘れないで自分でクリーンアップする必要があることです。それらはtempdbデータベースからのものです。

例を挙げたSQLのCTEとは何ですか?

CTE共通テーブル式)は、別のSELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる一時的な結果セットです。これらは、SQL Serverのバージョン2005ノートで導入されました:このレッスンのためのすべての例は、Microsoft SQL Server Management StudioのとAdventureWorks2012データベースに基づいています。

一時テーブルとテーブル変数はtempdbに保存されていますか?

テーブル変数:ただし、テーブル変数は現在のユーザーのみが使用できます。一時テーブル一時テーブルはtempdbに保存さます一時テーブル一時変数はトランザクションを使用できません。一時テーブルを使用てDML操作を実行すると、トランザクションをロールバックまたはコミットできます。

SQL ServerのCTEの範囲は何ですか?

共通テーブル式CTE )は、単一のSELECT、INSERT、UPDATE、DELETE、またはCREATEVIEWステートメントの実行スコープ内で定義される一時的な結果セットと考えることができます。 CTEは、オブジェクトとして保存されず、クエリの期間中のみ存続するという点で、派生テーブルに似ています。

CTEのパフォーマンスを改善するにはどうすればよいですか?

2つのオプションがあります。最初のCTEの結果を#tempテーブルに貼り付けます。計算列をベーステーブルに追加します。 3つの答え
  1. トランザクションCTEへの参加。
  2. searchResultsのトランザクションへのあなた。
  3. 検索結果から最終的に選択したすべてのCOUNTサブクエリ。

CTEはサブクエリですか?

サブクエリは、外部クエリ内で定義されます。 CTEは、クエリ内から呼び出す前に定義されます。 CTEはそれ自体を参照できますが、サブクエリは参照できません。 CTEは、同じWITH句(ネスト)内の他のCTEを参照できます。

SQLでのCTEの利点は何ですか?

CTEは、メタデータを格納するビューを置き換えるために使用されます。 CTEは、パフォーマンスを低下させることなく、コードの可読性を向上させるのに役立ちます。これらは、パフォーマンスを低下させることなく、コードの保守性を向上させるのに役立ちます。これらにより、T- SQLでの再帰コードの記述が以前のSQLServerバージョンよりも大幅に簡単になります。

一時テーブルはどのくらい持続しますか?

一時テーブルのタイムトラベル保持期間は1日です。ただし、(テーブルが作成された)セッションが終了すると一時テーブルがパージされるため、実際の保持期間24時間またはセッションの残りのいずれか短い方なります。

テーブル変数とは何ですか?

テーブル変数は、一時テーブルといくつかの類似点があるローカル変数です。テーブル変数は、他のローカル変数と同様に宣言ステートメントを介して作成されます。それらのスコープ内で、テーブル変数はSELECT、INSERT、UPDATE、およびDELETEステートメントで使用できます。

ビュー内に一時テーブルを作成できますか?

いいえ、ビューは単一のSELECTステートメントで構成されていますビューでテーブル作成または削除することはできません。 CTEは1つの文の実行範囲内で定義されている一時的な結果セットであり、彼らはビューで使用することができます

SQLインデックスとは何ですか?

インデックスは、テーブルまたはビューに関連付けられたディスク上の構造であり、テーブルまたはビューからの行の取得を高速化します。これらのキーは、 SQL Serverがキー値に関連付けられた1つまたは複数の行をすばやく効率的に検索できるようにする構造(Bツリー)に格納されます。

SQLのビューとは何ですか?

SQLでは、ビューはSQLステートメントの結果セットに基づく仮想テーブルです。ビューのフィールドは、データベース内の1つ以上の実表のフィールドです。 SQL関数、WHERE、およびJOINステートメントをビューに追加して、データが1つのテーブルからのものであるかのようにデータを表示できます。

いつCTEを使用しますか?

CTEは、次の目的で使用できます。
  1. 再帰クエリを作成します。
  2. ビューの一般的な使用が必要ない場合は、ビューの代わりに使用します。つまり、定義をメタデータに保存する必要はありません。
  3. スカラー副選択から派生した列、または決定論的ではないか外部アクセス権を持つ関数によるグループ化を有効にします。

SQLの一時テーブルとは何ですか?

SQL Serverの一時テーブルは、その名前が示すように、データベースサーバー上に一時的に存在するデータベーステーブルです。一時テーブルには、通常のテーブルのデータのサブセットが一定期間保存されます一時テーブルは、システムデータベースである「tempdb」内に格納されます。