OPTIMIZER INVALIDATION PERIOD

目次

基本情報

 

パラメータ情報

 

Syntax   : _OPTIMIZER_INVALIDATION_PERIOD
設定方法  : ・Parameter File
      ・ALTER SYSTEM SET “_OPTIMIZER_INVALIDATION_PERIOD” = 18000
      ・ALTER SESSION SET “_OPTIMIZER_INVALIDATION_PERIOD” = 18000

 

バージョンとデフォルト
9iR2 : -
10gR1: 18000
10gR2: 18000
11g: ?

 

説明

 

Oracle10gから統計情報を収集する際に関連SQL Cursorをすぐにinvalidationさせず、一定時間が経過した後invalidationさせます。_OPTIMIZER_INVALIDATION_PERIODパラメータは、この値を決定します。デフォルト値は18000(秒)(=5時間)です。つまり、統計情報の収集によって統計情報が変更された後、約5時間かけてランダムな時点に該当Cursorが実行されるとinvalidationが発生します。これを、Auto Invalidationと呼びます。一定時間にわたってランダムにCursorをInvalidationすることにより、特定の時点でHard Parseが一度に殺到する現象を回避することができます。

DBMS_STATSパッケージを利用して統計情報を収集する際NO_INVALIDATEオプションを利用してSQL Cursorがinvalidationされる時点を指定することができます。NO_INVALIDATEオプションの値によるinvalidation動作は以下の通りです。

 

・NO_INVALIDATE= False:統計情報の変更時に関連するSQL Cursorがすぐにinvalidationされます。
             9iからのデフォルトです。

・NO_INVALIDATE= True:統計情報の変更時に関連するSQL Cursorをinvalidationしません。
            SQL CursorがShared PoolからFlushされた後、Reloadされる変更された統計情報が
            反映されます。

・NO_INVALIDATE= DBMS_STATS.AUTO_INVALIDATE:統計情報の変更時に関連するSQL Cursorを一定時間
          (_OPTIMIZER_INVALIDATION_PERIOD)にかけて均等に(ランダムに)invalidationします。
          10gでのデフォルトです。厳密に言えば、既存SQL Cursorをinvalidationさせるのではなく、
          新しいChild Cursorを生成します。生成されたChild CursorをV$ SQL_SHARED_CURSORビューで
          照会してみるとroll_invalid_mismatchによってMismatchが発生したものとして処理されることを
         確認することができます。

注意

10gでの統計情報収集

 

Oracle10gからno_invalidateオプションのデフォルト値がDBMS_STATS.AUTO_INVALIDATEです。つまり、統計情報を再収集しても関連するSQL Cursorがinvalidateされなません。したがって、統計情報を反映して与えるにShared PoolをFlush(alter system flush shared_pool)しなければなりません。

統計情報の収集の基本的なガイドは、Oracleの基本的な行動様式(すなわちAuto invalidation)を使用しますが、特定のSQL CursorをすぐにinvalidationするSessionレベルで_OPTIMIZER_INVALIDATION_PERIODパラメータの値を減らすことです。

alter system set "_optimizer_invalidation_period" = 1;

関連情報

 

1. DBMS_STATSパッケージ