ヒストグラム統計が古い場合の統計の外挿
ユーザーはしばしば日付間隔にまたがってデータベースに問合わせをします。述部における日付間隔の1つのまたは両方の限度は、述部でテーブルに指定した日付列について統計が最後に収集された後に、そのテーブル内に挿入された行の日付です。
統計の外挿によって、例えば、指定されている日付の1つまたはすべてが、DATE列セットの統計ヒストグラムに保存されている最新の日付を過ぎているような日付範囲述部を指定する問合わせを、実行依頼できます。そのような問合わせをサポートするため、最適化ルーチンは外挿技術を適用して、統計を再収集する必要なしに、統計が最後に収集された後に挿入されている行について合理的な見積もりを行ないます。統計の外挿法は、派生統計の形式で表示できます(派生統計を参照)。
ここで説明する将来の日付の定義は、DATE列で統計が最後に収集された日付と現在の日付の間のにある日付にのみ適用されます。つまり、futureとはごく限られた相対的な用語であり、外挿は日付外挿リクエスト クエリーを実行依頼したときに存在しない、実際の将来の日付を持つデータには適用されません。むしろ、その用語は、統計的に不確かな日付に適用されます。
- テーブルのカーディナリティ Vantageは、以下の情報からの外挿を利用してテーブル カーディナリティを更新します。
- ヒストグラム サマリー情報
- 入手可能で、信頼性が高く、陳腐化していないシステムUDIカウント
- 履歴データ
- 単一AMPサンプリングまたは全AMPサンプリング
- 固有値の数とヒストグラムの最大値の両方に関する陳腐化したヒストグラム
外挿ロジックは、陳腐化した統計を検出して外挿を適用するために最後に統計が収集または更新されてからのデータ増加を予測します。最適化ルーチンは、UDIカウントと外挿ロジックの両方から導出されたカーディナリティ見積もりを集約して正確なカーディナリティ見積もりを作成し、陳腐化した統計の検出をより堅牢なものにします。また、UDIカウントを使用することにより、最適化ルーチンは、UDIカウントの追跡から得られるデータ変更の精度が向上するため、内挿も実行できます。
Vantageでは、動的単一AMPサンプルまたは全AMPサンプルに基づいたカーディナリティを見積もるために外挿も使用します。
最適化ルーチンの統計を外挿する機能を使用しても、統計を再収集する必要がなくなるわけではありません。
静的列における残余統計と動的AMPサンプル統計の相対的な正確度
動的AMPサンプル(このセクションでは、用語動的AMPサンプルとは、動的な単一AMPサンプリングのみを指します)の観点では、静的列に対する残余統計(残余とは最近収集されたものではない既存の統計を意味します)の相対的な正確さと、残余統計が古いと見なされるかどうかは、いくつかの要因によって決定されます。残余統計は、必ずしも古いというわけではありません。
残余統計という用語は、そのような統計は列データを正確に描写していない可能性があることを示唆しています。これは、正しい前提条件である必要はありません。
インデックスまたは列セットに対して初めてCOLLECT STATISTICSリクエストを発行するときに、さまざまなしきい値オプションを指定することによって、不必要に統計を再収集しなくて済むようになります。しきい値オプションを使用した統計の再収集に関する詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>のCOLLECT STATISTICS (最適化ルーチン形式)を参照してください。
列セットの相対的デモグラフィックが変更されていない場合、残余統計は一般にインデックスまたは列セットの現在のデモグラフィックの信頼できる表現になります。残余統計が存在する場合、派生統計フレームワークによる残余統計と動的AMPサンプルの間の比較によって、最適化ルーチンは、残余統計が古いかどうかの最終判断を行ないます。
テーブルのカーディナリティを10パーセント以上増やすことが可能ですが、特定の値を持つその行数の相対的な割合は変わりません。このいわゆる10パーセント ルールは、行パーティション化されたテーブルのパーティション レベルでも適用されます。変更された行パーティションの数が、テーブルの行パーティションの総数の10パーセントを超える場合(言い換えれば、10パーセントを超える行が行パーティションに追加されるかまたは行パーティションから削除されている場合)は、そのインデックスに対して統計を再収集する必要があります。行パーティション化されたテーブルと列パーティション化されたテーブルの場合、どのような統計の更新にもシステム派生のPARTITION列を含める必要があります。
このような安全対策の結果として、この程度のテーブルのデモグラフィックへの変更が、最適化ルーチンの生成する問合わせ計画に影響することはなくなります。
これが真の場合、残余統計は、通常は優れたカーディナリティ見積もりが得られる新しく収集した動的AMPサンプルよりも正確である可能性があります。これは、サンプリングされる列がインデックス付けされているかどうかにある程度依存する単一AMPの動的AMPサンプルであったとしても同様です(動的AMPサンプリングを参照)。動的AMPサンプリングから収集される統計の正確さは、内部DBS制御フィールドの設定で決定されるサンプリング対象のAMP数にも多少依存します。指定可能な範囲は、1 AMP、2 AMP、5 AMP、ノード上のすべてのAMP、またはシステム上のすべてのAMPとなります。詳細については、Teradataサポート担当者に問合わせてください。
外挿カーディナリティ見積もりによるテーブルの拡大の評価
最適化ルーチンは、SUMMARY統計を使用して、テーブルの基本カーディナリティ見積もりを確立します。続いて、Vantageは保存されているSUMMARY統計からの動的サンプルと新しいサンプルを比較してカーディナリティを外挿します。システムは、新旧のサンプル間の差をテーブルのカーディナリティの拡大として解釈します。
最適化ルーチンは、SUMMARY統計(適切なCOLLECT SUMMARY STATISTICSリクエストを実行して明示的に収集または再収集するか、SUMMARY統計を間接的に更新する列セットに対する統計を収集または再収集する)と、動的AMPサンプルまたは収集済みのPARTITION統計(パーティション化されているかどうかに関わらずすべてのテーブルから収集できる)からのテーブル カーディナリティを見積もります。SUMMARY統計の収集では、複数の最適化を利用してプロセスの実行を効率化しています。したがって、最もオーバーヘッドが少なくなる方法を使用して、正確なカーディナリティ見積もりを最適化ルーチンに提供するのが理想です。
データベースは、リクエストがコンパイルされた時点で取り出された新しい動的AMPサンプルと、SUMMARY統計から得られたサンプルを比較して、それによってテーブルの拡大についての変化を判断します。サンプルの絶対見積もりが正確でない場合でも、拡大率は、システム上のすべてのAMPにわたって均一である限り正確です。それは、リクエストがコンパイルされるたびに同じAMPを使用して「動的」統計サンプルが収集されるためです(詳細は動的AMPサンプリングを参照)。
派生統計の有用性についての比較シナリオ
NUSIをクエリー計画に使用するかどうかを確認するために、最適化ルーチンが統計を評価しているとします。クエリー計画にNUSIが有効かどうかを決定する標準的な評価基準は、データ ブロックごとに満たされる行数が1より少なければならないということです。
平均データ ブロック サイズが50キロバイトで、平均行サイズが50バイトであると想定します。この場合、データ ブロックごとに平均1,000行になります。特定のNUSIに対する行数が、2,000行ごとに1つ、つまり2データ ブロックごとに1行になるとします。最適化ルーチンは、NUSIを使用すればかなりの数のデータ ブロックの読み取りを節約でき、問合わせ計画でそのようにすれば結果としてフル テーブル スキャンをするよりI/Oが少なくなると判断します。
ではここで、テーブルが10パーセントずつ大きくなるとしましょう。対象となる行数は2,200行ごとに1(テーブルのカーディナリティが10パーセント増加)ということになります。この場合、データ ブロックごとの行数は依然として1より少ないので、最適化ルーチンには良い問合わせ計画を作成するための新たな統計は必要なく、派生統計のフレームワークがこれを検出します。
一方で、スプールに適格な行数を最適化ルーチンが見積もる必要があるという、結合シナリオについて考えてみます。これは重要になる場合があります。つまり、そこからの行数が10パーセント増加すると、最適化ルーチンが結合計画の選択をあるものから別のものに変えてしまう場合もあるからです。これは、元の見積もりが境界点に近い場合には特にそうです。
派生統計のフレームワークで残余統計が古いかどうかを検出できない場合、残余統計を処理するということは、最適化ルーチンが、高速で新しい計画ではなく、悪い問合わせ計画を選択したことを意味している可能性があります。あるいは、さらに悪いことに、残余統計が前の計画よりもっと遅い結合計画を新たに作成することもありえます。