統計情報のワナ
Oracle10gからCBOしかサポート対応しなくなったのは有名な話です。
肝心のCBOに必要な統計情報を収集するジョブがあるのですが、収集する日時が若干変です。
統計情報を収集するスケジュールは
systemユーザーで下記のSQLを実行することで確認ができます
SQL> SELECT sw.window_name, sw.repeat_interval, sw.duration
FROM all_scheduler_wingroup_members swm
INNER JOIN all_scheduler_windows sw
ON swm.window_name = sw.window_name
WHERE swm.window_group_name = 'MAINTENANCE_WINDOW_GROUP';
実行すると下記のような結果となります。
SW.WINDOW_NAME SW.REPEAT_INTERVAL SW.DURATION
---------------- --------------------------------------------------------------------- ----------------------
WEEKNIGHT_WINDOW freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0 +000 08:00:00
WEEKEND_WINDOW freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0 +002 00:00:00
上記の結果によると、統計情報が収集されるスケジュールは
WEEKNIGHT_WINDOW→月~金曜日の毎日22時から8時間
WEEKEND_NIGHT→土日曜日0時から2日間
ということになります
平日は毎晩1回収集するという設定にもかかわらず、土日は2日で1回しか
統計情報が収集されません。
またこのままの設定だと金曜の22時に収集した後の8時間後の土曜6時に収集するというスケジュールになり、
統計情報を取る意味がまったくありません。
データの量にもよりますが土日に更新が多いようなデータベースの場合、
月曜日のパフォーマンスが心配になってきます。
ありがちなパターンとしては
業務系のシステムで従業員からのアクセスがない土日に大量のデータを更新
月曜日にアクセスした場合、統計情報が古いためパフォーマンスの悪化が発覚
といったケースが考えられます。
こうした自体を防ぐためには下記のいずれかの対策をとる必要があります。
・大量のデータを更新後統計情報を取り直す
・土日の夜も平日の夜と同じように統計情報をとるようにする
・月曜日のアクセスはがまんしてもらう
・大量のデータを更新後統計情報を取り直す
には下記のSQLを実行し、統計情報を更新します。
SQL> BEGIN
DBMS_STATS.GATHER_DATABASE_STATS ();
END;
/
・土日の夜も平日の夜と同じように統計情報をとるようにする
にはsysユーザーで下記のようなSQLを実行する必要があります。
SQL> EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE('WEEKEND_WINDOW','repeat_interval','freq=daily;byday=SAT, SUN;byhour=8;byminute=0;bysecond=0');
SQL> EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE('WEEKEND_WINDOW','duration','+000 08:00:00');
・月曜日のアクセスはがまんしてもらう
この場合は批判を甘んじて受け入れる覚悟をしておきましょう。
- Category(s)
- oracle
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/horii/7d718a0860c55831306e30ef30ca/tbping
- ¦
- Main
- ¦