Oracle10g Cost Base Optimizerにまつわる検証 その3

<Oracle10g Cost Base Optimizerにまつわる検証 その3>
~Monitoring属性の変~
ペンネーム:グリーンペペ

先回はMonitoring属性の表の監視情報がdba_tab_modificationsビューで参照
可能であることを確認しました。
また、表の監視情報は統計情報を取得すると消えることを確認しました。

ではdba_tab_modificationsビューにて参照可能な監視情報とCost Base Optimizer
はどのような関係があるのでしょうか?

表の監視情報をしばらくながめていると、どうも1日経つと消えてしまう場合
があるようです。

■環境
Miracle Linux Standard Edition V2.1
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0

■EMP2の監視情報を取得

SQL> select sysdate from dual;

SYSDATE
--------
04-11-03

SQL> select TABLE_NAME,INSERTS from user_tab_modifications;

TABLE    INSERTS
----- ----------
EMP2          42

■EMP2の監視情報を取得(翌日)

SQL> select sysdate from dual;

SYSDATE
--------
04-11-04

SQL> select TABLE_NAME,INSERTS from user_tab_modifications;

no rows selected

監視情報が消えるということは誰かが統計情報を取得しているということです。
でもこの環境はグリーンペペしか使ってないし、誰もそんなことはやるはずが
ありません。
ということはOracleが勝手に取得しているのでは??
そうなんです。
10gからは統計情報はデフォルトで自動収集されるようになっています。
とはいえ、全ての表について統計情報を取得するのでは負荷が掛かってしまう
ので、表の監視情報を使って表に含まれる行の10%以上が変更されている場合
には統計情報を取得するようになっています。
そのjobは10g新機能であるOracle Schedulerによってスケジューリングされて
います。

■統計情報を自動実行するjob詳細

SQL> select owner,
            job_name,
            schedule_name,
            program_name,
            last_start_date,
            last_run_duration,
            comments
        from dba_scheduler_jobs;

OWNER                          JOB_NAME
------------------------------ ------------------------------
SYS                            GATHER_STATS_JOB

SCHEDULE_NAME                  PROGRAM_NAME
------------------------------ ------------------------------
MAINTENANCE_WINDOW_GROUP       GATHER_STATS_PROG

LAST_START_DATE                    LAST_RUN_DURATION
---------------------------------- --------------------------
04-11-04 15:00:02.784079 +09:00    +000000000 00:00:37.191593

COMMENTS
------------------------------------------------------------
system default gather statistics maintenance job


SQL> select owner,program_name,program_action,comments
     from dba_scheduler_programs;

OWNER                          PROGRAM_NAME
------------------------------ ------------------------------
SYS                            GATHER_STATS_PROG

PROGRAM_ACTION
-------------------------------------------------------------
dbms_stats.gather_database_stats_job_proc

COMMENTS
-------------------------------------------------------------
gather statistics maintenance program


SQL> select * from dba_scheduler_wingroup_members;

WINDOW_GROUP_NAME              WINDOW_NAME                   
------------------------------ ------------------------------
MAINTENANCE_WINDOW_GROUP       WEEKNIGHT_WINDOW              
MAINTENANCE_WINDOW_GROUP       WEEKEND_WINDOW                


SQL> select window_name,repeat_interval,duration,comments
     from dba_scheduler_windows;

WINDOW_NAME
------------------------------
WEEKNIGHT_WINDOW
WEEKEND_WINDOW

REPEAT_INTERVAL
---------------------------------------------------------------------
freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0
freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0

DURATION                       COMMENTS
------------------------------ --------------------------------------
+000 08:00:00                  Weeknight window for maintenance task
+002 00:00:00                  Weekend window for maintenance task

GATHER_STATS_JOBという名前のjobがDBMS_STATS.GATHER_DATABASE_STATS_JOB
_PROCプロシジャをコールしています。このプロシジャは内部プロシジャでマ
ニュアルには記載されていませんが、GATHER AUTO オプションを使用するDBMS
_STATS.GATHER_DATABASE_STATSプロシジャとほとんど同じです。主な違いは、
DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC プロシジャは、統計を必要と
するオブジェクトに優先順位が設定されるため、更新済の統計を最も必要とす
るオブジェクトが最初に処理されることです。
このjobによりオブジェクトの統計が以前に収集されていない場合、またはdba
_tab_modificationsビューを参照し、表に含まれる行の10%以上が変更されて
いる場合に統計情報を取得するようになっています。
また、このjobは月-金曜日の22時から翌6時、土日曜日の終日の間で実行
されるようにスケジュールされていることがわかります。

■まとめ

1. 10gからは統計情報は毎日決まった時間に自動で取得される。
2. 統計情報を取得するオブジェクトはdba_tab_modificationsを参照し、表に
   含まれる行の10%以上が更新されているもの。
3. dba_tab_modificationsビューに記録される監視情報はmonitoring属性の表
   について。
4. 10gからは初期化パラメタstatistics_level=typical(default値)かallの場
   合自動で表の属性がmonitoring属性となる。

つまり、統計情報はもれなく取得されるのでCBOが使われるということですね。

今週はココマデ。

編物に挑戦の茅ヶ崎にて