最適化ルーチンは、リレーションと結合のカーディナリティを見積もる際、見積もりの正確性の信頼度レベルに基づいて行ないます。最適化ルーチンの信頼度レベルは、クエリー最適化のプロセスでの分析の対象となるテーブルについて利用できる統計データに関する特定のナレッジを前提とした場合に、カーディナリティに関する特定の見積もり値の正確さがどの程度のものかに関する定性的信頼度レベルを表わします。
信頼度レベルは、問合わせ計画作成の各ステップで使用可能などの戦略が最良であるかを決定するために最適化ルーチンが使用する係数の1つです。信頼度レベルが低いほど、特に結合計画では、より慎重な戦略が採用されます。これは、問合わせ計画における誤差が累積するためです(また、結合計画では誤差は倍増します)。このため、特に結合計画では、問合わせステップの計画に使用するデータの正確性が高くないという疑いがあったり、完全で正確な統計を入手できる場合ほどの信頼度がない場合、最適化ルーチンはできるだけ無難な問合わせ計画を選択します。
古い統計に基づくカーディナリティ見積もりは正確でないことがあり、カーディナリティ見積もりが正しい場合に生成されるほど最適でないクエリー計画が最適化ルーチンによって生成されることがあります。古い統計の列セットまたはインデックスの集合が、現在のデモグラフィック値をほとんど反映していない場合は、動的単一AMPサンプルから収集された部分統計の方が、より正確な計画を生成できる可能性があります。
最適化ルーチンの信頼度レベルについて
EXPLAINでは、カーディナリティ見積もりに対して次のいずれかまたはすべての信頼度レベルをレポートします。
- 信頼度なし
- 低い信頼度
- 高い信頼度
- インデックス結合の信頼度
Teradata Databaseは、結合操作の場合のみインデックス結合の信頼度を報告します。
これらの信頼度のレベルは、主に、レポートされるSQLリクエストの述部で指定される列およびインデックスの集合に対する統計の有無に基づいています。唯一の例外は、問合わせ条件が非常に複雑で統計を使用できない場合です。このような場合、EXPLAINは信頼度なしと報告します。
なお、結合操作に信頼度がない場合でも、最適化ルーチンはその条件に対して有効な統計を使用して、それを使用しない場合よりも良質な問合わせ計画を作成できる可能性を高めます。リレーションの1つについて「信頼度なし」がある場合、他方の信頼度が「低い」、「インデックス結合」、「高い」のどれであっても、その結合操作の全体的な信頼度レベルは「信頼度なし」になります。これは、リレーションの1つの結合列についての統計が存在する場合でも該当します。最適化ルーチンは常に信頼度レベルが結合内のリレーションの1つに割り当てられている中で低い方の信頼度レベルに等しいと想定するためです。
信頼度なし自体は計画が良くないことを示すものではありません。いくつかのステップで信頼性がなくても、最適化ルーチンは通常、(特に適切な統計を収集していれば)合理的な計画を生成します。ステップが基本テーブルのみを参照している場合は、これらのテーブルの統計情報の収集を検討する必要があります。
同様に、高い信頼度レベルによっても正確なカーディナリティ見積もりは保証されません。例えば、最適化ルーチンが列またはインデックス セットに対する統計ヒストグラムの1つにクエリーの述部の値を突き止めたとします。この場合、信頼度は高いと想定されます。しかし、利用できる統計データが古いとしましょう。最適化ルーチンは、高い信頼度レベルによりもたらされる想定事項を追求することにより、結果として適切ではない計画を作成する可能性があります。
次の節で示すのは、信頼度レベルの概要のみです。これらの節は総合的なものではないため、特殊な場合については考慮されていません。
一般に信頼度レベルがカーディナリティ見積もりに割り当てられるのは、次の2種類の操作の場合だけです。
- 単一テーブルの検索
- 結合
最適化ルーチンが報告する信頼度レベルと、QCD StatsRecテーブルのレベル属性に記録されている信頼度レベルは、まったく関係がないことに注意してください。
単一テーブル検索操作の信頼度レベル
次のテーブルに、文脈内での各信頼度レベルの意味、および各信頼度レベルが単一テーブルの検索操作に対して割り当てらいる理由を示します。
信頼度レベル | 意味 | 理由 |
---|---|---|
いいえ | Teradata Databaseのリレーションのカーディナリティおよび固有値の見積もりの信頼度レベルは高くも低くもない。 最適化ルーチンは関係のあるステップを最適化するために保守的な戦略を追求する。 |
次のいずれかの状況が存在する。
|
低い | Teradata Databaseはリレーションの見積もりカーディナリティおよび固有値見積もりが正しいことを中程度信頼している。 最適化ルーチンは関係のあるステップを最適化するためにより積極的な戦略を追求する。 |
リレーションに対して次のいずれかの状態が存在する。
単一AMP動的AMP統計サンプルの信頼度が常に低くなります。 統計が収集されていない場合の見積もりでは、EXPLAINは常に信頼度なしとレポートします。しかし、問合わせが実際に実行される場合、Teradata Databaseは必ず、少なくとも1つのAMPで動的なサンプリングを実施します。 |
高い | Teradata Databaseはリレーションの見積もりカーディナリティおよび固有値見積もりが正しいことをかなり信頼している。 最適化ルーチンは関係のあるステップを最適化するためにより積極的な戦略を追求する。 |
|
インデックス結合 | 適用なし | 結合にのみ適用されます。 |
スプールからの検索操作では、信頼度レベルはスプールを生成したステップの信頼度レベルと同じです。
結合操作の信頼度レベル
結合操作の場合、SQLリクエストを実行するために必要な各結合操作の各ステップの結果がおよそ何行になるかを最適化ルーチンは把握している必要があります。最適化ルーチンはこの情報を使用して、リレーション結合のための最適な計画を選択します。その他の情報(結合方式や結合ジオグラフィなど)も加味して、結合計画はリレーションの最良の結合順序を決定します。結合句1つにつき128個のテーブルを結合できるため、結合カーディナリティ見積もりの誤差を最小限に抑え、最適な問合わせ計画が生成されるようにすることが重要です。
なお、結合処理での誤差は累積的であるため、結合計画で誤差発生の可能性を最小限に抑えることが非常に重要です。最適な結合処理を実現するための唯一の方法は、すべてのインデックスおよび非インデックス結合列に対して最新の統計を維持することです。
結合カーディナリティおよび値見積もりごとの行数の信頼度では、ほとんどの場合、同じような条件下の単一テーブル検索よりも信頼度レベルは低くなります。これは、次を含むいくつかの理由によります。
- 結合において左右のリレーションに該当する行が1行のみで、結合カーディナリティの見積もりだけが信頼度が高いと評価されている。
- 結合操作の信頼度レベルは、入力リレーションの信頼度を超えることなく、常に信頼度が低い方のリレーションの信頼度が優先される。
次のテーブルに、文脈内での各信頼度レベルの意味、および各信頼度レベルが結合操作に対して割り当てられる理由を示します。すべてのリレーショナル結合は2項演算です。単一の操作では2つ以下のリレーションが結合されることはありません。むしろ、複数のリレーションの結合は連鎖しており、以前の結合操作の結果がスプールされ、最適化ルーチンが結合計画に対して決定するシーケンス内の次のリレーションに結合できます。
信頼度レベル | 意味 | 理由 |
---|---|---|
いいえ | Teradata Databaseの見積もり結合カーディナリティの信頼度レベルは高い、低い、インデックス結合の信頼度のいずれでもない。 | 結合の1つ(または両方)のリレーションに、結合列の統計が含まれていない。 |
低い | Teradata Databaseは見積もり結合カーディナリティが正しいことを中程度信頼している。 |
|
高い | Teradata Databaseは見積もり結合カーディナリティが正しいことをかなり信頼している。 | 結合の片方のリレーションの信頼度が高く、他方の信頼度が次の2つの信頼度レベルのいずれかである。
|
インデックス結合 | 結合列の固有性制約のため、Teradata Databaseは見積もり結合カーディナリティが正しいことをかなり信頼している。 |
Teradata DatabaseでPRIMARY KEY制約およびUNIQUE INDEX制約を実装する方法により、これらは本質的に同じものを表わしています。 |
レポートされた信頼度レベルにおける動的AMPサンプリングの影響
スキュー分析は各AMPからの行の分散に基づいており、最適化ルーチンが表わす信頼度レベルを決定する係数です。
スキュー分析ではAMPごとの予測される行数を計算し、その数がAMPごとの予測行数の5%未満の場合、そのAMPはスキューAMPリストに移されます。スキューがあるリスト内のAMPの合計数が、サンプリングされたAMPの合計数の5パーセント以下である場合、信頼度レベルは低に設定され、そうでない場合は高に設定されます。
統計が動的に選択された1つだけのAMPからサンプリングされている場合、信頼度レベルは常に低に設定されます。