統計が最後に計算されてからテーブルやパーティションが大幅に変更された場合、その統計をそのまま使用すると、最適化ルーチンは良いアクセス計画や結合計画を生成できません。テーブルやパーティションが大幅に変更されたと見なされるのは、10%を超える行がテーブルに追加されたり、テーブルから削除されたりした場合、あるいは行パーティション テーブルにおいて10%を超える行がパーティションに追加されたり、パーティションから削除されたりした場合です。したがって、統計を定期的に再収集するか、削除します。どのパーティション テーブルの場合でも、更新操作には必ずシステム派生PARTITION列セットを含める必要があります。PARTITION列と行パーティション列セットでの統計の収集を参照してください。統計を最新状態に保つことは、システムでシステム派生統計と外挿が可能であるときでさえも、正確なクエリー計画を作成するときの重要な要素です。詳細については、Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142を参照してください。
パーティションまたはテーブルが空だったのが空でなくなったり、空でなかったのが空になったりするたびにPARTITION統計を再収集する場合、操作はかなり高速になるはずです。
以下に、古い統計情報によって、効率的でないクエリー計画が生成される例を示します。
テーブル | カーディナリティ | 統計 | 備考 |
---|---|---|---|
A | 1,000,000 | Y | 統計は最新のものではありません。 統計は、テーブルのカーディナリティが1,000行しかなかったときの初期段階で収集されました。 |
B | 75,000 | N | 最適化ルーチンは、このテーブルの動的AMP統計サンプルを収集します。 |
テーブルAとBの間でプロダクト ジョインを行なうリクエストを実行し、どちらかのテーブルをすべてのAMP上で重複させるクエリーを実行します。最適化ルーチンは、ディクショナリの中で統計を検査して、テーブルAのカーディナリティが1,000行だけであることを確認すると、テーブルBの75,000行よりはるかに少ないため(動的AMPサンプルから評価)、テーブルAの行を再配置します。テーブルAには現在1,000,000行あり、前の統計とは大きさが3桁も異なるため、最適化ルーチンは、テーブルAの75,000行ではなくテーブルBの1,000,000行を再配置するという、不適切な仮定を使用します。結果として、クエリー計画を作成する元となる統計が最新のものである場合に比べて、クエリーの実行にずっと長い時間がかかることになります。
古い統計を検出したとき、最適化ルーチンが派生統計と外挿を使用できる場合でさえも、これらの方法は、列セットの間隔ヒストグラムにある現在の統計をベースにして計算を実行します。したがって、現在格納されている統計よりも新しい統計に基づいて計算が実行されるため、見積もり値の精度が上がります。Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142を参照してください。
派生統計のフレームワークは、列セットに対して統計が収集されていない場合、動的AMPサンプルから取得された統計を使用します。詳細については、Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142を参照してください。最適化ルーチンは、格納されている動的AMPカーディナリティの見積もりと、現在の動的AMPカーディナリティの見積もりを比較し、テーブルの増加を判断するためのカーディナリティを推定します。
- テーブル(パーティション テーブルの場合ならいずれかのパーティション)のカーディナリティが大幅に(つまり、10%を超えて)変更された場合。ただし、この比率はあくまでも推奨値であり、特定のテーブルまたはシステムによって異なる場合があります。
- 統計が収集される対象であるインデックス、列、またはパーティションの値の範囲が大幅に(つまり、10%を超えて)変更された場合。ただし、この比率はあくまでも推奨値であり、特定のテーブルまたはシステムによって異なる場合があります。
テーブルまたはパーティションのカーディナリティが大幅に変更されたかどうかを簡単に評価するには、次の文を使用します。
文 | 返される情報 |
---|---|
HELP STATISTICS table_name; |
|
SELECT COUNT(*) FROM table_name; |
HELP CURRENT STATISTICSで生成されるレポートとの比較を目的とした固有インデックスに関する統計のカーディナリティ |
SELECT COUNT (DISTINCT column_name) FROM table_name; |
HELP CURRENT STATISTICSで生成されるレポートとの比較を目的とした非固有列に関する統計のカーディナリティ |
HELP CURRENT STATISTICSを使用すると、推定の固有値カウントが表示されます。SHOW CURRENT STATISTICS VALUESを使用すると、列またはインデックスに関する、推定によるサマリー情報が表示されます。
以前に収集された統計を更新するには、列またはインデックスの明示的なリストを指定しないでCOLLECT STATISTICSリクエストを実行します。COLUMNまたはINDEX句を省略した場合の統計収集を参照してください。システムは、すべての既存の統計を自動的に再収集します。この操作には全テーブル スキャンが必要なため、膨大な時間がかかる可能性があります。統計の収集と再収集には時間がかかることがあるを参照してください。
収集された統計の効果は、アクセスの種類によって異なります。収集した統計によってパフォーマンスが向上しているように思われない場合は、最適化ルーチンはテーブルのアクセスまたは結合に列を使用していないと考えられます。こうした動作が発生し、予想通り、最適化ルーチンが列セットを使用していないことをEXPLAINが報告する場合には、DROP STATISTICS文を使用して、その列に関する統計をデータ ディクショナリから除去します。
HELP STATISTICSリクエストを実行して、どの列とインデックスの統計が取られているかを判別したり、部分的にその収集情報を見ることができます。また完了情報をレポートするためSHOW STATISTICS VALUESを使用します。
Teradata Viewpoint統計マネージャ ポートレットでは、Teradata Database統計収集を管理でき、そのような機能には統計の収集と分析、ジョブの作成と制御、および推奨事項の管理を行なう機能が含まれます。Teradata® Viewpointユーザー ガイド、B035-2206を参照してください。
各列に対して統計が最後に収集された時刻を報告するクエリーを実行することもできます。次のクエリーは、統計が最後に収集されたデータベース名、列名、および日付をリストします。
SELECT DatabaseName ,TableName ,ColumnName ,CAST(LastCollectTimeStamp AS Date) As CollectionDate ,CAST(LastAlterTimeStamp AS Date) As LastAlter ,current_date - collectiondate AS FromCurrent ,lastalter - collectiondate AS FromAlter FROM DBC.StatsV WHERE ColumnName IS NOT NULL;
クエリーを編集して列のサブセットを指定することで、レポートを制限できます。