一、自動收集統計信息作業
統計信息是Oracle CBO優化器形成執行計劃的基礎,統計信息的收集對CBO優化器至關重要,Oracle 10g以後,優化器默認就是CBO模式,所以數據庫創建完以後默認創建了收集統計信息的作業。
在Oracle 10g數據庫中,如果我們是通過DBCA工具創建的數據庫,那麼數據庫中存在一個收集整個數據庫統計信息的自動作業叫GATHER_STATS_JOB。在Oracle 11g中,創建完數據庫會有默認的自動維護作業,其中一個叫“auto optimizer stats collection”,也是啟動收集統計信息的作用。可以通過下面查詢,看看該作業是否啟用。
SQL> select client_name, status from dba_autotask_client where client_name=’ auto optimizer stats collection’;
CLIENT_NAME STATUS
---------------------------------------------------------------- --------
auto optimizer stats collection ENABLED
統計信息能夠改善查詢的性能,但是在收集統計信息的過程中會對數據庫造成一定的壓力。所以我們可以根據需要統計相關的信息,停止系統的整體收集作業或者修改作用的運行窗口。
二、停止收集統計信息作業
有些系統中,有自己的收集統計信息任務,如用友的NC系統,可以通過下面過程停止收集任務。
SQL> BEGIN
2 DBMS_AUTO_TASK_ADMIN.DISABLE(
3 client_name => 'auto optimizer stats collection',
4 operation => NULL, window_name => NULL);
5 END;
6 /
PL/SQL procedure successfully completed.
SQL> select client_name,status from Dba_Autotask_Client where client_name='auto optimizer stats collection';
CLIENT_NAME STATUS
------------------------------------------------- --------
auto optimizer stats collection DISABLED
三、修改統計信息收集窗口時間
Oracle 11g中系統自動收集統計信息一窗口形式調度,沒周一至周五在每天晚上10點開始,持續4小時,周六周日全天。如果在這些時段中與系統的某些作用有沖突,可以調整收集的窗口時間,如下:
BEGIN
DBMS_SCHEDULER.DISABLE(
name=>'"SYS"."MONDAY_WINDOW"',
force=>TRUE);
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'"SYS"."MONDAY_WINDOW"',
attribute=>'DURATION',
value=>numtodsinterval(300, 'minute'));
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'"SYS"."MONDAY_WINDOW"',
attribute=>'REPEAT_INTERVAL',
value=>'FREQ=WEEKLY;BYDAY=MON;BYHOUR=2;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.ENABLE(
name=>'"SYS"."MONDAY_WINDOW"');
END;
/
上面腳本修改周一窗口,修改為凌晨兩點開始,持續5個小時。
通過下面的腳本,可以查詢作業的執行情況
SQL> SELECT client_name, window_name, jobs_created, jobs_started,jobs_completed
2 FROM dba_autotask_client_history
3 WHERE client_name like '%stats%';
總結:默認啟用的自動任務對於大多數系統來講是合適的,但是大家要根據自己的應用系統來合理使用。