全統計の代わりにサンプル統計を使用する理由
時折、フル テーブル統計を収集するために必要な労力を費やすことが難しいときがあります。例として、何十億行もある表があり、その収集には何時間もかかるが、収集時間枠は狭すぎて操作が許可されないという状況を想像してください。このような状況に直面した場合、適切な時間でフル テーブル統計の収集は不可能であるため、代わりにテーブル行のサンプルから統計を収集するようにできます。
COLLECT STATISTICSリクエストのUSINGオプションを使用して、いくつかの異なる統計サンプリング方式を指定できますが、指定した列が行パーティション化されたテーブルまたは列パーティション化されたテーブルのパーティション式の構成要素である場合は、SAMPLE USINGオプションを使用したサンプル統計収集はできません。
そのような列の統計は、指定の列がパーティション式の列セットのメンバーであり、さらにインデックス列セットのメンバーでもある場合に、COLLECT STATISTICS USINGオプションを使用することで収集できます。
サンプル統計は動的AMPサンプルとは異なります。サンプル統計を収集するには、COLLECT STATISTICS(最適化ルーチン形式)リクエストで、サンプリングする行のパーセンテージを明示的に指定します。一方、動的AMPサンプルの収集元のAMP数とそれらのサンプルが収集される時間はTeradata Databaseによって決定されるため、指定することはできません。Teradata DatabaseがCOLLECT STATISTICSサンプルのサンプリング パーセンテージを決定するように指定することもできます。さらに、サンプリングされた統計は、収集された統計の完全セットを生成し、動的AMPサンプルは間隔ヒストグラムに格納される統計の部分集合のみを収集します(詳細については動的AMPサンプリングを参照)。
統計のサンプリングは、適切な事前条件が満たされる場合、適切な統計見積もりを収集する信頼できる方法であるとして知られています。
フル テーブル統計ではなくサンプル統計を使用するということは、実は統計の正確さと引き換えに時間を獲得しているのです。サンプル統計を使用するのは、統計がないよりはサンプル統計があったほうが良いということが大前提になっています。
サンプル統計と動的AMPサンプルの正確性の比較
統計サンプルを動的AMPサンプルと混同しないようにしてください。動的AMPサンプルは、問合わせ計画のよりどころとすべき統計がない場合に、最適化ルーチンが収集するものです。統計サンプルは、すべてのAMPから取られ、たいてい動的AMPサンプルよりもはるかに正確です。
2つの統計収集方式の違いの一部を、次のテーブルに示します。
統計サンプリング | 動的AMPサンプリング |
---|---|
すべてのAMPから取った行の小規模なサンプルについて統計を収集する。 列にインデックス付けがされていない場合、行はAMPごとにランダムに編成されていることになり、Teradata Databaseは最初に検出される行のnパーセントだけをスキャンします。このnという値は、データにスキューが相対的にどの程度存在するかによって決まります。あるいは、システム構成およびサンプリングされるテーブルのカーディナリティに応じて、サンプル全体は各AMP上の最初のデータ ブロックから取ることができます。 列にインデックス付けがされている場合は、ハッシュ シーケンス行順序の利点を活かして、より高度なサンプリングが実行されます。 |
1つのAMPから取った行の小規模なサンプルについて統計を収集する。 これがシステムのデフォルトです。 内部DBS制御フィールドの値を変更することで、動的AMPサンプルを採取するAMPの数を変更できます。詳細については、Teradataグローバル サポート センターの担当者にお問い合わせください。 |
全統計を収集し、それをDBC.StatsTblStatsTblの間隔ヒストグラムに格納する。 間隔ヒストグラムも参照してください。 |
カーディナリティの見積もり、固有インデックス値の数、およびいくつかのその他の統計のみを収集し、それらをデータ ブロック記述子に格納する。 さらに、DBC.StatsTblStatsTblの間隔ヒストグラムの単一AMPおよび全AMPのカーディナリティの見積もりを収集して格納します。 |
ひずみを相殺するためにサンプル サイズを動的に拡張する。 | ひずみに敏感である。 |
すべての統計パラメータのかなり正確な見積もりを提供する。 | 次の条件を満たしている場合に、基本テーブルとNUSIカーディナリティのかなり正確な見積もりを提供する。
その他の標準統計パラメータはそれほど正確ではない。 |
100パーセントより低いレベルで単一列パーティション統計をサンプリングすることはできません。COLLECT STATISTICSリクエストを低いパーセンテージを指定して実行依頼してもリクエストが中断されることはなく、エラー メッセージも受け取りませんが、Teradata Databaseでは指定したパーセンテージを受け入れず、内部で自動的にサンプリング率を100に変更します(詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>のCOLLECT STATISTICS (最適化ルーチン形式)を参照してください)。
サンプル統計の再収集
最適化ルーチンまたはQCD (Query Capture Database)分析に対して、列またはインデックスの統計を再収集する場合、Teradata Databaseは最初の収集で使用されたのと同じ収集方法(フルテーブル スキャンまたはサンプリングのいずれか)を使用して統計を再収集します。DBS制御フィールドのSysSampleOptionを使用して、統計を再収集するためのデフォルト サンプリング パーセンテージを制御できます。DBS制御フィールドの詳細については、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。
これに対する唯一の例外は、初めて統計を収集するときにUSING SYSTEM SAMPLEを指定して、再収集用のFOR CURRENTオプションを指定しなかった場合です。USING SYSTEM SAMPLEオプションは、最初にフル テーブル スキャンを使用して統計を収集しますが、その後は、サンプリング パーセンテージを初期の100%サンプリングからそれ以上削減できなくなるまで徐々に格下げして行きます。
行パーティション化されたテーブルのインデックスの一部として列の統計を収集していた場合、Teradata Databaseは一般的なルールに従い、そのインデックス列についてのサンプル統計を再収集します。
収集オプションを変更する場合は、新しい収集オプションを全部指定した新しいCOLLECT STATISTICSリクエストを実行依頼するか、DBS制御フィールドのSysSampleOptionを使用してデフォルト サンプリング パーセンテージを変更する必要があります。これは、行パーティション テーブルまたは列パーティション テーブルのパーティション式の構成要素についてのサンプルCOLUMN統計には適用されません。これらのテーブルは有効ではないため、COLLECT STATISTICSリクエストに指定することができません。この特別なケースでは、Teradata Databaseは常にテーブルのすべての行に関する統計を収集(再収集)します。
ヒストグラムの統計を再収集するときに、そのヒストグラム用に保存されていたオプションを上書きするには、FOR CURRENTオプションを指定します。FOR CURRENTは、最新のCOLLECT STATISTICSリクエストに対してのみ指定された任意のオプションを使用して統計を再収集し、以降の再収集では保存されていたオプションに戻します。
システム判断によるサンプリング パーセンテージ、またはユーザー指定によるサンプリング パーセンテージのいずれかを使用して、サンプル統計を収集できます。ユーザー指定によるサンプル比率の場合、Teradata Databaseは指定された比率の行を読み込み、統計を収集します。サンプル パーセントが明示的に指定されている場合は、既存のルールがすべて適用されます。
統計の収集時にUSING SYSTEM SAMPLEオプションが指定された場合は、最適化ルーチンが全統計の収集からサンプル統計の収集に切り替える適切なタイミングを判断します。このアプローチを使用して、最適化ルーチンは、収集するデモグラフィックの品質を落とすことなく、サンプリングを実行するタイミングと、全統計の収集までのサンプリング程度を使用するタイミングの両方を決定します。この格下げプロセスは次のように機能します。
- サンプル統計の収集リクエストが初めて発行されたときに、Teradata Databaseは全統計を収集します。これは、100%サンプルが指定された場合と同じです。これにより、統計の再収集時にパーセンテージを格下げするタイミングを判断できるデータが最適化ルーチンに与えられます。
- 以降の統計の再収集リクエストで、最適化ルーチンは、再収集時のサンプリング パーセンテージを格下げするタイミングを決定するのに十分な履歴データが収集されたと判断するまで全統計の収集を継続します。
- この履歴データを使用して、最適化ルーチンは、ひずみのある列か、ローリング列か、静的列かを判断できます。
- その後、最適化ルーチンは、DBC.StatsTbl.UsageType列に保存された列使用法(詳細データまたはサマリー データ)を考慮し、全統計の収集からサンプル統計の収集に格下げするタイミングを判断するために指定された間隔数を評価します。
Teradata Databaseは、詳細データではなくサマリー データが使用されるヒストグラムのサンプル統計への格下げについてはより積極的です。
- 次に、最適化ルーチンは、統計の再収集に使用するサンプリング パーセンテージを2~100%の範囲で決定します。
さらに、列の履歴と特性に基づいてサンプリング パーセンテージを調整するための最適な式を決定します。
- プロセスの最終段階で、Teradata Databaseは再収集した統計と列履歴の品質を比較します。最適化ルーチンは、サンプリング パーセンテージを下げても十分高品質な結果が得られることを認識している場合にのみ以降の再収集時にサンプリング パーセンテージを下げます。
このプロセスにより、サンプル統計を正確に使用できる列とそうでない列を区別する手間が省けます。最初に全統計を収集することによって、以降の統計の再収集におけるサンプリングの度合いをインテリジェントに判断するために必要な情報が最適化ルーチンに与えられます。
詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>の「COLLECT STATISTICS (最適化ルーチン形式)」を参照してください。