原貼地址:http://www.dbform.com/html/2008/538.html
在Oracle10g中引入的優化器統計信息(Optimizer Statistics)自動收集,是一個看上去很不錯的功能,但是在實際應用中卻往往沒有起到相應的效果,甚至在某些系統中我們會建議禁用這個功能。
闡述一些該功能的相關知識點。
1. Automatic Statistics Gathering是由Scheduler調度GATHER_STATS_JOB作業來完成的,在GATHER_STATS_JOB作業中則調用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC存儲過程。
2. 該作業在創建數據庫的自動創建,並且設置爲每天晚上10點到第二天早上6點和週六週日的全天爲運行窗口期。在運行窗口期內,該作業都會運行,根據stop_on_window_close屬性來決定,如在窗口期結束以後,該作業如果還沒有運行完畢,是繼續運行還是結束運行。
3. GATHER_DATABASE_STATS_JOB_PROC是內部的存儲過程,基本上跟DBMS_STATS.GATHER_DATABASE_STATS的功能一樣,但是有內部的優先順序考慮,更新越多的表將會越優先收集統計信息。
4. 收集統計信息的表對象是,之前從來沒有收集過的或者是更新的(包括insert,update,delete,truncate)記錄數超過當前總記錄數10%的表。記錄數的更改量由Oracle數據庫自動監控,在初始化參數statistics_level設置爲TYPICAL或者ALL時,自動監控即會生效。
5. 在USER_TAB_MODIFICATIONS表中記錄了所有被監控的表的數據量更改信息。該信息的更新將會稍微滯後於真實的修改,可以通過DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO存儲過程來立刻將更改的信息更新到USER_TAB_MODIFICATIONS表中。對於更新之後再rollback的記錄,仍然算爲已經受影響的記錄,Oracle不會在rollback之後再去更新USER_TAB_MODIFICATIONS表。
- SQL> select * from user_tab_modifications where table_name='EMP';
- no rows selected
- SQL> select count(*) from emp;
- COUNT(*)
- ----------
- 14
- SQL> update emp set sal=sal+100;
- 14 rows updated.
- SQL> select * from user_tab_modifications where table_name='EMP';
- no rows selected
- SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
- PL/SQL procedure successfully completed.
- SQL> select inserts,updates,deletes from user_tab_modifications wheretable_name
- ='EMP';
- INSERTS UPDATES DELETES
- ---------- ---------- ----------
- 0 14 0
- SQL> rollback;
- Rollback complete.
- SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
- PL/SQL procedure successfully completed.
- SQL> select inserts,updates,deletes from user_tab_modifications wheretable_name
- ='EMP';
- INSERTS UPDATES DELETES
- ---------- ---------- ----------
- 0 14 0
- SQL>
6. 在Oracle10g版本(包括最新的10.2.0.4)中沒有已知的修改10%這個閥值的方法。但是在Oracle11g中則提供了SET_TABLE_PREFS等函數。
以下命令將指定表的STALE默認值從10%改爲5%,該值可以從新的dba_tab_stat_prefs數據字典中查詢獲得。
- --僅限於Oracle11g版本
- BEGIN
- DBMS_STATS.SET_TABLE_PREFS ( ownname =>'KAMUS', tabname =>'T1', pname=>'STALE_PERCENT', pvalue =>'5');
- END;
- /
- SQL> select * from dba_tab_stat_prefs;
- OWNER TABLE_NAME PREFERENCE_NAME PREFE
- ---------- ---------- -------------------- -----
- KAMUS T1 STALE_PERCENT 5
7. 在Oracle10g中運行以下命令,可以禁用統計信息自動收集功能。
- BEGIN
- DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');
- END;
- /