統計情報と共有プール上の実行計画をうまく使う
オプティマイザ統計の扱いと、共有プールの理解はデータベース・システムを安定稼動させる上でたいへん重要なので、DBエンジニアの皆さん必読の記事ですね。
どんなに高価なインフラを用いても、オプティマイザの生成する実行計画の理解を誤ると、アプリケーションのパフォーマンス劣化を起こすといった自体も起こりえます。そのため、DBAや開発者の皆様がオプティマイザの"仕組み"を理解し、正しく扱えるということはSQLチューニングにおいて重要ですし、運用時にトラブルが発生した場合の対処知見としても、最も重要だと思います。
さて、オプティマイザ統計の記事で紹介されているDBMS_STATSパッケージの各プロシージャ、例えばDBMS_STATS.GATHER_TABLE_STATS には「no_invalidate」というオプションが用意されています。
このオプションを用いて、統計情報収集時に共有プール上の実行計画(依存カーソル)を無効化するか、しないかを制御できます。統計情報収集時に、ハードパースを行わせて即座に実行計画に反映させる、といったオペレーションも可能になります。
例えばOracle RAC環境で、各ノードのSQL実行計画を完全に一致させるため、統計情報収集時には「no_invalidate」を明示的に指定する、といったケースがあります。
システムの特性に応じて、統計情報と共有プール上の実行計画をうまく使うことが重要ですね。