問合わせ最適化の目標
最適化ルーチンの基礎タスクは、SQL問合わせに応じるデータを取得するための最も効率的なアクセスと実行計画を生成することです。この問合わせ計画は、指定したSQLリクエストに対して結果を最も効率的に提供できるステップ、順序、並列性、およびデータ アクセス方法を決定します。
- データベースの物理的実装
- 現在の間隔ヒストグラム統計および動的AMPサンプル統計
- システム構成とコスト計算の公式
- 列とインデックス セットカーディナリティ
- 重要な代替計画を生成するアルゴリズム
- 検索スペースのサイズを制限する経験則
これらの要因の一部は、最適化ルーチンの内部で事前に定義されたアルゴリズムと経験則であり、管理対象外です。ただし、物理データベース設計を変更したり問合わせを微調整することによって、その他の要因を制御し操作することができます。
- テーブルのレイアウトとビューの選択
- テーブルにプライマリ[AMP]インデックスを付けるかどうかの選択
- プライマリ[AMP]インデックス列セット
- 行パーティション テーブルの場合、パーティション化式の選択肢
- 列パーティション テーブルの場合、各列パーティション内の列と列パーティション オプションの選択
- セカンダリ インデックス、結合インデックス、およびハッシュ インデックスの選択と種類
- 列とインデックス セット統計の使用可能度と正確性
- 統計キャッシュのサイズ
- クエリー。Vantageは、クエリー リライトの広範なセットを提供しようとする間に、クエリー自体のリライトでパフォーマンスを向上させることがあります。
リレーショナル システムで問合わせ最適化ルーチンが必要な理由
リレーショナル システムでは、SQLの構文および字句ルールに従っているクエリーはすべて有効なので、それぞれの個別のクエリーが提示するさまざまな条件に従って、さまざまな方法でテーブルにアクセスしたり、テーブルを集約したり、テーブルを結合できなければなりません。このことは、解決法の余地が非常に大きく、間違ったクエリー計画を選択したときのペナルティーが重大である、意思決定支援およびデータ マイニング アプリケーションには特に当てはまります。
さまざまなリクエストごとにデータベースのデモグラフィックが大きく変わる場合は、同一のSQL問合わせであっても、それを最適化する方法は根本的に異なります。最適化を行なわなければ、リレーショナル環境では、問合わせのパフォーマンスは向上しません。
クエリー最適化ルーチンの概要
以下の図はSQLクエリー最適化ルーチンの非常に高レベルの表記です。
最適化ルーチンへの入力(図の「SQLクエリーの入力」)は、クエリー リライトからのResTree出力です。オリジナルのSQLリクエスト テキストは注釈付きの構文解析ツリーとしてすでに再定式化されているため、最適化ルーチンへのResTree入力はResTreeまたはRed Treeと呼ばれ、クエリー リライトへ入力されたResTree/Red Treeから区別されます。
プラン調査領域はさまざまなクエリー計画と結合計画およびサブプランが生成され、コストの見積もりが行なわれるワーク領域です(枝の多い検索ツリーを参照)。
コスト エンジンはプラン調査領域で生成されたさまざまな計画およびサブプランのコストを比較し、所定の評価セットからコストの最もかからない計画を返します(コストベースの最適化を参照)。
コスト エンジンは、所定の「最良の」計画を選択するために、収集されたサマリー統計から派生するものか動的AMPサンプル見積もりから派生するものかにかかわらず、評価対象のリレーションのセットに関する統計情報に基づくカーディナリティの見積もりを主に使用します。これらの評価を作成するために使用される統計データは、データ ディクショナリに維持されています(最適化ルーチンの統計およびデモグラフィックを参照)。
経験則的エンジンとは、コスト単独で最良の計画を決定することができない状況で、計画とサブプランの評価に使用されるルールとガイドラインのセットです。
このフレームワークが機能することを前提として、クエリー リライトと最適化ルーチンは、以下の処置をほぼ次のような順序で実行します。
- SQL問合わせをある種の内部表現方法に変換する。
- 変換結果を標準形式に書き換える。標準形式への変換を、通常はクエリー リライトと呼びます。さらに正確に言えば、クエリー リライトは、クエリー最適化の標準プロセスを構成するクエリー処理ステップを指定する処理ステップです。クエリー リライトの詳細については、クエリー リライト、統計、および最適化を参照してください。
- データベース テーブルへのアクセス、結合、集約処理の候補になる方法を評価する。結合計画には、以下の追加要素があります。
- 結合方式の選択。
多くの場合、同じ結合の作成に使用できるいくつかの選択可能な方式があります。例えば、必ずではないものの通常は、マージ結合を使用する方が積結合よりもコストが低くなります。方式の選択は多くの場合、問合わせの処理の全体コストに大きな影響を与えます。
- 最適な結合位置の決定。
結合する行の移動方法が異なると、コスト面でかなり異なることがあります。例えば、結合操作内のテーブルのサイズによっては、テーブルの1つをコピーする方が、それを再分散するよりも低コストの場合があります。
- 最適な結合順序の決定。
一度に結合できるのは2つのテーブルのみです。テーブルのペアが結合される順序は、結合コストにかなりの影響を与える場合があります。この文脈では、テーブルは別のテーブルではなくスプールと結合できます。テーブルという語は、その語の最も一般的な意味で使用されています。問合わせの最適化についての説明においては、多くの場合、テーブルおよびスプールは、どちらもrelationsという論理的用語を用いて分類されます。
- 結合方式の選択。
- 候補となる問合わせ計画をいくつか作成して、生成したセットから実行コストがもっとも低い計画を選択する。計画は、AMPステップ(AMPステップを参照)という低レベル命令の集まりであり、このステップは最もコストの低い方法で問合わせ結果を生成するように最適化ルーチンによって生成されます。計画のコストについての説明は、統計およびコストの見積もりを参照してください。
問合わせ最適化ルーチンのタイプ
- ルール ベースの最適化ルーチン
一連の厳しいルールに基づいて、どの候補計画を使用するかを決定します。ルール ベースの最適化ルーチンは経験則的最適化ルーチンとも呼ばれます。
- コスト ベースの最適化ルーチン
候補となる計画のどれを使用するかは、相対的な環境コストとリソース使用コストと、さまざまな経験則的な手段とを考え合わせた上で決定されます。使用されるのは、常にもっともコストのかからない計画です。
実際は、意思決定支援環境では、ルール ベースの最適化ルーチンはコスト ベースの最適化ルーチンよりもパフォーマンスが低いことが証明されています。データベース問合わせ最適化ルーチンは、コスト ベースです。
コスト ベースの問合わせ最適化ルーチンも、コストのみでは評価対象のセットから最良の計画を決定できないような状況では、ルール、または経験則を使用します。しかし、最適な計画を決定する主な方法はコスト計算です。経験則も特定のカテゴリまたは結合順序評価スペースから結合順序検索ツリーの特定の枝を絞り込むためにも使用されます。しかし、経験則が最適な結合順序をもたらすことはほとんどないと経験的に知られているため、経験則は評価に費やす労力に見合う価値がないとみなされています。
- 相互接続(BYNET通信)コスト
- I/Oコスト(特に2次ストレージ)
- CPU (計算)コスト
これらのコストは常に時間で評価されること、またコストはミリ秒単位の増分で分析されることに注意してください。当然、所要時間が最も短い操作が、実行コストが最も低い操作になります。
最適化ルーチンによって生成された計画は、すべてさまざまな統計データ、データのデモグラフィック、環境的なデモグラフィックに基づいています。最適化ルーチンは、順序を問わず、その並行機能は自動的かつ無条件です。
- 一連の候補戦略から優れている戦略をすばやく見つける。
- 明らかに貧弱な戦略を避ける。