[解決済み】CTE、サブクエリ、テンポラリテーブル、テーブル変数にパフォーマンスの違いはありますか?
質問
この優れた
SO質問
との違い。
CTE
と
sub-queries
が議論されました。
具体的にお聞きしたいのですが。
以下の各項目は、どのような場合に効率的/高速化されるのでしょうか?
- CTE
- サブクエリ
- テンポラリーテーブル
- テーブル変数
従来は、たくさんの
temp tables
を開発する際に
stored procedures
- というのは、たくさんのサブクエリが絡み合っているよりも読みやすいと思われるからです。
Non-recursive CTE
それとも、最も効率的な解決策を見つけるために、常にさまざまなオプションをいじくり回さなければならない場合でしょうか?
EDIT
最近、効率性という点では、ヒストグラムすなわち統計を関連付けることができるテンポラリテーブルが最初の選択肢として良いと言われました。
どのように解決するのですか?
SQLは宣言型言語であり、手続き型言語ではありません。 つまり、欲しい結果を記述するためにSQL文を作成するのです。 SQLエンジンに どのように を実行する。
原則として、SQLエンジンとSQLオプティマイザに最適なクエリプランを見つけさせるのがよいでしょう。 SQLエンジンの開発には多くの人・年の労力がかかっているので、エンジニアが知っていることをやらせてあげましょう。
もちろん、クエリプランが最適でない状況もあります。 その場合は、クエリヒントを使ったり、クエリを再構築したり、統計情報を更新したり、一時テーブルを使ったり、インデックスを追加したりなどして、パフォーマンスを向上させたいものです。
ご質問の件ですが CTE とサブクエリは、どちらもクエリオプティマイザに同じ情報を提供するため、理論的には同じ性能になるはずです。 1つの違いは、複数回使用されるCTEを簡単に特定し、1回で計算できることです。 そして、その結果を保存し、複数回読み込むことができます。 残念ながら、SQL Serverはこの基本的な最適化方法(これを一般的なサブクエリの削除と呼ぶかもしれません)を利用していないようです。
テンポラリー・テーブルは、クエリの実行方法についてより多くのガイダンスを提供しているので、別の問題です。 大きな違いは、オプティマイザがクエリプランを確立するために、テンポラリーテーブルの統計情報を使用できることです。 その結果、パフォーマンスを向上させることができます。 また、複数回使用される複雑なCTE(サブクエリ)がある場合、それを一時テーブルに格納することで、パフォーマンスが向上することがよくあります。 クエリは一度だけ実行されます。
ご質問の答えは、特に定期的に実行される複雑なクエリでは、期待するパフォーマンスを得るために弄る必要があるということです。 理想的な世界では、クエリオプティマイザは完璧な実行経路を見つけることができます。 しかし、より良いパフォーマンスを得るための方法を見つけることができるかもしれません。
関連
-
[解決済み] バックエンドバージョンでは、データベースのダイアグラムやテーブルのデザインはサポートされていません。
-
[解決済み] PostgreSQL - json 型の等値演算子を識別できませんでした。
-
[解決済み] ORA-01821: ISO 8601 のローカルタイム付き日付のフォーマットが認識されないエラー
-
[解決済み] シンプルに保つ、クエリで複数のCTEを行う方法
-
[解決済み] GROUP BYとDISTINCTの違いは何ですか?
-
[解決済み】SQLサーバーでテーブル変数と一時テーブルを使用するのはいつですか?
-
[解決済み】SELECT * INTO tempTable FROM CTE クエリでテンポラリテーブルを作成する方法
-
[解決済み] [Solved] TSQLでカーソルを使用せずにテーブル変数をループする方法はありますか?
-
[解決済み] CTEとSubQueryの違い?
-
[解決済み】SQL Serverでtempテーブルとテーブル変数の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 "指定された集約関数を含まないクエリを実行しようとしました。"
-
[解決済み】Excelに合体的な関数はありますか?
-
[解決済み] テスト
-
[解決済み】SQL Server: 無効なカラム名
-
[解決済み】ORA-01791: SELECTされた式ではない
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] Varchar は Sum 演算子では無効です。
-
[解決済み] ORA-04063: ビューにエラーがあります
-
[解決済み] FROM のサブクエリにはエイリアスが必要です。
-
[解決済み] CTEとSubQueryの違い?