ハッシュ インデックスのうちの該当する列については、実テーブルや結合インデックスの場合と同じように定期的に統計データを収集することが必要です。ほとんどのアプリケーションでは、ハッシュ インデックスの列ではなく実テーブルの列に関する統計データを収集する必要があります。ハッシュ インデックスの列ではなく基本テーブルの列についての統計データを収集を参照してください。
このガイドラインの重要な例外として、複合式にハッシュ インデックスが定義されていて、関係のある基本テーブルの列に述部式がその複合式を指定する場合が挙げられます。
複雑な式は、述部の右側の単純な列参照以外のものを指定する式として定義されています。最適化ルーチンは、ハッシュ インデックス式に完全にマップできる複雑な式からの統計データのみを使用できます。
これらの式のハッシュ インデックスに関する統計データを収集すると、述部で基本テーブルの式を指定するクエリーで、単一テーブルのカーディナリティに関する最適化ルーチンの見積もり能力が向上します。Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142を参照してください。
ハッシュ インデックスに関する統計の収集および再収集時に、常にSAMPLEオプションを使用することを考慮します。これらのオプション、およびその使用方法に関する推奨事項については、サンプリングによる統計の収集コストの削減を参照してください。
BY句を指定してハッシュ インデックスを作成した場合は、INDEX句を使用して列セットを指定することにより、該当する列に関する統計データを収集したり削除したりできます。
例えば、あるハッシュ インデックスが次のように定義されているとします。
CREATE HASH INDEX ord_hidx_8 (o_custkey, o_orderdate) ON orders BY (o_custkey, o_orderdate) ORDER BY (o_orderdate);
この場合であれば、次の例に示すようにして、パーティション列に関する統計データを収集できます。
COLLECT STATISTICS ON ord_hidx_8 INDEX (o_custkey, o_orderdate);
BY句の定義の中で指定した列を使用できるのは、COLLECT STATISTICS文でINDEXキーワードを使用した場合だけです。
あまりいい方法ではありませんが、COLUMN句の構文を使って統計データを収集する方法もあります。そのためには、2つの別個のリクエストを実行する必要があります。
COLLECT STATISTICS ON ord_hidx_8 COLUMN o_custkey; COLLECT STATISTICS ON ord_hidx_8 COLUMN o_orderdate;
個々の列ではなく、インデックス自体に関する複数列インデックスの統計を収集することをお勧めします。インデックス列に関する統計を1つのセットとして収集すると、より多くの選択性を得られるからです。
例えば、WHERE x=1 AND y=2のような条件を含むクエリーでは、列xと列yの統計データを個別に収集するよりも、INDEX (x,y)についての統計データが収集されている場合の方がよく最適化されます。
DROP STATISTICS文についても、同じ制限が適用されます。