SQL実行計画取得取得時の注意点

2023 年 1 月 10 日 by hiro-k

実行計画を取得する際、おそらく皆さんは評価環境で実行計画を取得し、
本番環境に対象SQLを導入しているかと思います。

間違いではないのですが、それで発生した問題について共有します。

ある統計情報を取得するために新たな参照SQLを導入しました。
評価系では1万件程度の参照結果で1秒以内に完了し、
実行計画ではIndexの利用なども想定通りで問題ありませんでした。
ですが、いざ本番環境に導入すると、このSQL実行で17分も掛かっていることが判りました。
ファイル出力等に時間がかかっているのかと思いましたが、
参照結果を見ても数千件程度の結果でこちらにも問題は無さそうでした。
何が問題なのか判らなかったため、本番環境で実行計画を取得したところ、
評価環境で取得した実行計画の結果と全く違い、
Indexの利用がおかしくなっていたためのようでした。

なぜ実行計画が評価環境と本番環境で異なっていたのか?ですが、
DBチームに確認したところ、おそらく評価環境と本番環境の
レコード数の差が大きいため、Oracleが自分で利用するIndexを判断し、
遅くなっているのではないか?という事でした。
その為、今回対応したSQLについてHINT句を利用してIndexを変更したところ、
1秒以内で完了し、17分掛かっていたプログラムも1分以内で終了するようになりました。

このようなことがあった為、今は必ず本番環境で実行計画を取得し、
導入するような体制になっています。

皆さんも実行計画を取得する際、評価環境と本番環境の
レコード数に大きな差がある場合、評価環境と本番環境の実行計画に差が出ていないか
確認するようにしてください。

TrackBack