亀より速く、鳥より高く。

ITエンジニア&農業手伝いの個人ブログ

【Oracle】SQL性能悪化リカバリの奥の手「統計情報の削除」

前置き

SQLの性能には、SQLの実行計画が大きく影響します。

実行計画はOracleのDBが内部で判断します。その判断の元になるのが統計情報です。統計情報はテーブルのデータが何件あるか、キーの情報が何件あるか、どのような分布になっているかなど、まさしくデータの統計情報です。多くのシステムではOracleの設定で自動取得しているのではないでしょうか。

実行計画を狙ったものにするためにヒント句入れることがありますが、今回の記事はヒント句を入れる時間が無い緊急の場合にも活用できる可能性があります。当てはまらない場合、逆に悪くなる場合もあるかもしれませんので、よく読んで自己責任でお願いします。

最終的にはヒント句での固定がベストだと思っています。この記事は一次対応用と思っていただけたらと思います。

統計情報の削除が有効なケース

1つは処理の途中で件数が大きく増えるワークテーブルを参照する場合です。

なぜ有効か?

そのワークテーブルは処理途中で件数が増え、最後は0件に戻るとしたらどうでしょうか。統計情報の自動取得が0件の時間帯に行われていると、そのテーブルは0件としてOracleが実行計画を判断します。

すると、ハッシュで結合した方が効率的な場合でも、ネスティッドループで結合するなど効率の悪い実行計画が作成されるケースが出てきます。

統計情報を削除するとどうなるか?

初回実行時に統計情報が取得されるため、ワークテーブルの件数が増えた後のその件数で統計情報が取得されます。そのため、これから処理をしようとしているワークテーブルの状態で実行計画が判断され、最適な実行計画になる可能性が高まります。

統計情報を削除するSQL

このSQLで削除できます。

analyze table テーブル名 delete statistics;

確認はこちらのSQLで行います。

select table_name, last_analyzed from user_tables where table_name = 'テーブル名';

selectの結果、last_analyzed が null で出力されると、統計情報が削除できています。

 

以上です。

最後までご覧いただき、ありがとうございます。お役に立てれば幸いです。