Teradataでは、次のようなステートメントを使用できます...
collect statistics on my_table column(col1)
これにより、テーブルの統計が収集され、ColumnStats、IndexStats、MultiColumnStatsなどのDBCビューに保存されます。また、オプティマイザー(解析エンジン)は、統計が利用可能になったときにそれらを見つけて、推定テーブルカーディナリティ/インデックス値カウントの代わりにそれらを使用して、クエリの実行方法をより適切に決定するという印象を受けています。
これはすべて素晴らしいように聞こえますが、いくつか質問があります。
collect stats
を使用することに不利な点はありますか?collect statistics
に関するその他のコメントをいただければ幸いです。1>収集統計を使用することに不利な点はありますか?
はい、統計の収集自体には時間がかかります。実際には、AMPSからデータを検索し、辞書テーブルに統計を挿入します。
次のようなテーブル定義があるとします。
ct t1(x1 int、y1 int、z1 int);
テーブルには数百万の行が含まれており、z1がST/Join条件で使用されることはないため、z1の統計を収集する価値はありません。
2> SQLスクリプトで統計収集を使用するのはいつ適切/不適切ですか?
すでに上で答えました。列がST/Join条件として使用される場合、つまりwhere句またはon句で使用される場合は、統計を収集する必要があります。それ以外の場合は不要です。
3>すでにインデックスが作成されているフィールドの統計を収集することによるパフォーマンス上の利点は何ですか?
ct t1(x1 int、y1 int)プライマリインデックス(x1);
x1 = 5であるt1からのsel *のような単純なクエリの場合。
統計収集の有用性を示します。
どうやって?
オプティマイザは、このクエリが選択する行数を正しく見積もることができ、t1がたとえばt2と結合される場合、オプティマイザによって効率的な結合が選択されます。
4>(テーブル、揮発性テーブル)の統計はどのくらいの期間保存されますか?
表:恒久的に。
揮発性テーブル:セッションが期限切れになるまで。
5>統計の収集に関するその他のコメントをいただければ幸いです。
複数列の統計については何も議論されていません。
たとえば、クエリは次のようになります。
sel * t1からy1 = y2およびx1 = 2でt2に参加します。
次に、(x1、y1)で複数列の統計を収集すると、最適化に非常に役立ちます。
また、テーブルの人口統計が変更された(行数が増えた)場合は、統計の再収集を検討する必要があります