CTEはサブクエリよりも高速ですか?
質問者:Srivatsa Gaisreiter |最終更新日:2020年3月23日
カテゴリ:テクノロジーおよびコンピューティングデータベース
CTEとサブクエリはどちらもほぼ同じパフォーマンスと機能を備えています。 CTEには、 CTEで再帰を使用できるという点で、サブクエリを使用するよりも優れています。 CTEを使用する最大の利点は、読みやすさです。 CTEは、同じ文のどこサブクエリができないように参照を複数回することができます。
このうち、CTEはサブクエリよりも優れていますか?CTEの最大の利点は、サブクエリが機能しない場合にCTEが再帰的になる可能性があることです。また、 CTEは、サブクエリでは参照できない、同じステートメント内の複数のタイを参照できます。個人的に、私はほとんどの場合、内CTEがサブクエリよりも読みやすいと思います。
また、CTEとビューの違いは何ですか? CTEは、本質的に一時的なビューです。これは、定義された後の単一のクエリに対してのみ存在する名前付きクエリです。これにより、繰り返し使用または参照される複雑なサブクエリを使用したクエリの記述が簡単になります。 CTEにはそれ自体への参照を含めることができますが、ビューには含めることができません。
したがって、一時テーブルはCTEよりも高速ですか?
それぞれに数百万行のレコードがある複数のテーブルを結合している場合、 CTEのパフォーマンスは一時テーブルよりも大幅に低下します。一時テーブルは常にディスク上にあります。CTEをメモリに保持できる限り、おそらくより高速になります(テーブル変数のように)。
あるCTEが別のCTEを参照できますか?
複数のCTEを定義し、それらを1つのSELECTステートメントで参照できるだけでなく、別のCTEを参照するCTEを作成することもできます。これを行うために必要なのは、使用する前に参照されるCTEを定義することだけです。
39関連する質問の回答が見つかりました
CTEを複数回使用できますか?
CTEは、同じWITH句(ネスト)内の他のCTEを参照できます。サブクエリは他のサブクエリを参照できません。 CTEは、呼び出し元のクエリから複数回参照できます。
ビューでCTEを使用できますか?
共通テーブル式は、短縮形ではCTEとも呼ばれ、SELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる一時的な名前付き結果セットです。 CTEはビューでも使用できます。
SQLでのCTEの利点は何ですか?
CTEは、メタデータを格納するビューを置き換えるために使用されます。 CTEは、パフォーマンスを低下させることなく、コードの可読性を向上させるのに役立ちます。これらは、パフォーマンスを低下させることなく、コードの保守性を向上させるのに役立ちます。これらにより、T- SQLでの再帰コードの記述が以前のSQLServerバージョンよりも大幅に簡単になります。
SQL ServerでCTEを使用する必要があるのはいつですか?
CTEを使用する理由
SQLでは、サブクエリを使用してレコードを結合したり、サブクエリからレコードをフィルタリングしたりします。私たちは、同じデータを参照するか、サブクエリを使用してレコードの同じセットに参加するたびに、コードの保守性が困難になります。 CTEを使用すると、読みやすさとメンテナンスが容易になります。 CTEはパフォーマンスを向上させますか?
主な違いの1つは、オプティマイザが一時テーブルの統計を使用してクエリプランを確立できることです。これにより、パフォーマンスが向上する可能性があります。また、複数回使用される複雑なCTE (サブクエリ)がある場合は、それを一時テーブルに格納すると、パフォーマンスが向上することがよくあります。
CTEのパフォーマンスを改善するにはどうすればよいですか?
2つのオプションがあります。最初のCTEの結果を#tempテーブルに貼り付けます。計算列をベーステーブルに追加します。 3つの答え
- トランザクションCTEへの参加。
- searchResultsのトランザクションへのあなた。
- 検索結果から最終的に選択したすべてのCOUNTサブクエリ。
SQL ServerのCTEにインデックスを作成できますか?
いいえ。CTEは一時的な「インライン」ビューです。このような構成にインデックスを追加することはできません。インデックスが必要な場合は、 CTEのSELECTを使用して通常のビューを作成し、それをインデックス付きビューにします(ビューにクラスター化インデックスを追加することにより)。
CTEはどのように機能しますか?
CTE (共通テーブル式)は、別のSELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる一時的な結果セットです。これらはSQLServerバージョン2005で導入されました。これらはSQLに準拠しており、ANSI SQL99仕様の一部です。 CTEは常に結果セットを返します。
CTEは一時テーブルですか?
一時テーブルは、tempdbデータベースに物理的に作成されます。これらのテーブルは通常のテーブルとして機能し、また、通常のテーブルのようなインデックスを制約を持つことができます。 CTEは、複雑なサブクエリデータを操作するために使用される名前付きの一時的な結果セットです。これは、Tempdbデータベースではなくメモリに作成されます。
CTEで一時テーブルを使用できますか?
#一時テーブル
あなたは非常に大きな結果セットを持っている、または複数回、それを参照する必要があります場合は、#の一時テーブルに置きます。再帰的である必要がある場合、使い捨てである必要がある場合、または単に論理的に何かを単純化するためである場合は、 CTEが推奨されます。また、パフォーマンスのためにCTEを使用しないでください。 CTEはTempDBを使用していますか?
CTEを使用したクエリは、SQLの他のクエリよりもTempDBを自動的に使用しません。テーブルスプールは再帰CTEに使用され、スプール演算子には使用されているように見えます。私は通常、実行プランでスプール演算子を使用するCTEを見つけます。 Microsoftによると、スプールオペレータは一時テーブルを使用します。
一時テーブルに対するテーブル変数の利点は何ですか?
一時テーブルに対するテーブル変数の利点の1つは、テーブル変数が関数、ストアドプロシージャ、またはそれらが定義されているバッチの最後に自動的にクリーンアップされるのに対し、一時テーブルは削除することを忘れないで自分でクリーンアップする必要があることです。それらはtempdbデータベースからのものです。
一時テーブルに外部キーを設定できますか?
外部キー関係の制限の1つは、一時テーブルに依存しているキーテーブルから行を削除できないことです。データベース間の外部キー制約を設定できず、TempDBデータベースに一時テーブルが技術的に作成されていることが原因である可能性があります。
CTEはメモリに保存されていますか?
したがって、ストアドプロシージャ内で宣言されたCTEは、ディスクに格納されます。関数、プロシージャ、ビュー定義などは、それらが作成されたデータベースに保存されます。この定義はディスクに保存され、保証されています。したがって、ストアドプロシージャ内で宣言されたCTEは、ディスクに格納されます。
テーブル変数とは何ですか?
テーブル変数は、一時テーブルといくつかの類似点があるローカル変数です。テーブル変数は、他のローカル変数と同様に宣言ステートメントを介して作成されます。それらのスコープ内で、テーブル変数はSELECT、INSERT、UPDATE、およびDELETEステートメントで使用できます。
CTE一時テーブルとテーブル変数の違いは何ですか?
この最大の違いは、 CTEは現在のクエリスコープでのみ使用できるのに対し、一時テーブルまたはテーブル変数はセッションの全期間にわたって存在できるため、それらに対してさまざまなDML操作を実行できることです。以下は、各テストクエリタイプのT-SQLです。
一時テーブルとテーブル変数はtempdbに保存されていますか?
テーブル変数:ただし、テーブル変数は現在のユーザーのみが使用できます。一時テーブル:一時テーブルはtempdbに保存されます。一時テーブル:一時変数はトランザクションを使用できません。一時テーブルを使用してDML操作を実行すると、トランザクションをロールバックまたはコミットできます。