web-dev-qa-db-ja.com

Oracle 11G-インデックスの再構築とGATHER_TABLE_STATS

簡単な質問です。テーブルにデータを入力した後、説明プランを通じて、ほとんどの場合、インデックスはGATHER_TABLE_STATSを実行した後にのみ有効になるように見えることに気付きました。

Exec DBMS_STATS.GATHER_TABLE_STATS(ownname => 'USER/SCHEMA', tabname => 'MYTABLE', cascade=> true, degree=> 8);

"[〜#〜] cascade [〜#〜]"属性は次のように定義されました:このテーブルのインデックス。インデックス統計の収集は並列化されていません。このオプションを使用することは、テーブルの各インデックスでGATHER_INDEX_STATSプロシージャを実行することと同じです。

私の質問は、インデックスの統計情報を収集して再構築することを想定しているので、GATHER_TABLE_STATSの前にインデックスのREBUILDを実行する必要がありますIS NOT同じことです、 またはそれは?

現時点では、dbms_index_utl.build_table_indexesを実行してインデックスを再構築し、その後にGATHER_TABLE_STATSを実行します。必要かどうかはわかりませんが、説明プランにそれが示されているようです。私のクエリへのヒント、インデックスは使用されません。

5
denisb

統計の収集とインデックスの再構築は、2つのまったく別のものです。

  • Oracleのインデックスを再構築する必要があることは非常にまれなので、インデックスを定期的に再構築しているプロセスは非常に疑わしいものです。インデックスを再構築する必要はないと思います。そして、リチャードフットの Index Internals-Rebuilding the Truth を読んで質の高い時間を過ごすことを強くお勧めします。インデックスの再構築が非常にまれにしか必要とされない理由と、それが必要ないくつかのケースを理解するためです。
  • 適切なクエリプランを決定するためにオプティマイザに必要な情報を提供するために、データボリュームまたは分散に大きな変化がある場合は、テーブルとインデックスの統計を収集する必要があります。空のテーブルにインデックスを作成し、その後数百万行をテーブルに挿入する場合は、統計を収集して、テーブルが1つの空のエクステントではなくなったことをオプティマイザに通知する必要があります。自動ジョブを無効にしない限り、Oracleは、毎日早朝に統計が最後に収集されてから大幅に変更されたオブジェクトの統計も自動的に収集します。
7
Justin Cave

すべてのインデックスを再構築した場合、インデックスに関する統計を収集する必要はありません。 10g以降、「Oracleデータベースは、インデックスの作成および再構築中に自動的に統計を収集するようになったため」 COMPUTE STATISTICS オプションは廃止されました。

テーブルの統計を収集すると役立つ場合がありますが、cascade => falseを設定すると時間を節約できます。

1
Jon Heller