統計情報を取得してもSQLが遅い
人気ブログランキング
この前、DBMS_STATS をしてもSQLが遅くて少したったら速くなったということがあった。
Oracle10gからデフォルトで22時に統計情報を取得してくれるようになったが、
それを待ったわけでなくなぜだろう?と思っていったん放置していた。
たまたま、DBMS_STATSパッケージの罠 を見て、とった統計情報がすぐに使われるわけではないそうだ。
実行計画を決めるのは、HARD PARSE する時だから、カーソルを無効にさせないとだめなんですね。
exec dbms_stats.gather_table_stats('SCOTT', 'EMP');
ではだめで
exec dbms_stats.gather_table_stats('SCOTT', 'EMP', no_invalidate=>false);
こうしないとダメらしい。
マニュアル を見るとまさしくその通りのことが書いてあった。
DBMS_STATS.SET_DATABASE_PREFS でデフォルトを変更できるようだが、false がデフォルトでいいような気がする。
統計情報取るときって、メンテ中か空いている時間にすると思うしね。
Oracle10gからデフォルトで22時に統計情報を取得してくれるようになったが、
それを待ったわけでなくなぜだろう?と思っていったん放置していた。
たまたま、DBMS_STATSパッケージの罠 を見て、とった統計情報がすぐに使われるわけではないそうだ。
実行計画を決めるのは、HARD PARSE する時だから、カーソルを無効にさせないとだめなんですね。
exec dbms_stats.gather_table_stats('SCOTT', 'EMP');
ではだめで
exec dbms_stats.gather_table_stats('SCOTT', 'EMP', no_invalidate=>false);
こうしないとダメらしい。
マニュアル を見るとまさしくその通りのことが書いてあった。
DBMS_STATS.SET_DATABASE_PREFS でデフォルトを変更できるようだが、false がデフォルトでいいような気がする。
統計情報取るときって、メンテ中か空いている時間にすると思うしね。
この記事へのコメント