Automatic Statistics Gathering

原貼地址: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表。

  1. SQLselect * from user_tab_modifications where table_name='EMP';
  2.  
  3. no rows selected
  4.  
  5. SQLselect count(*) from emp;
  6.  
  7.   COUNT(*)
  8. ----------
  9.         14
  10.  
  11. SQLupdate emp set sal=sal+100;
  12.  
  13. 14 rows updated.
  14.  
  15. SQLselect * from user_tab_modifications where table_name='EMP';
  16.  
  17. no rows selected
  18.  
  19. SQLexec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
  20.  
  21. PL/SQL procedure successfully completed.
  22.  
  23. SQLselect inserts,updates,deletes from user_tab_modifications wheretable_name
  24. ='EMP';
  25.  
  26.    INSERTS    UPDATES    DELETES
  27. ---------- ---------- ----------
  28.          0         14          0
  29.  
  30. SQLrollback;
  31.  
  32. Rollback complete.
  33.  
  34. SQLexec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
  35.  
  36. PL/SQL procedure successfully completed.
  37.  
  38. SQLselect inserts,updates,deletes from user_tab_modifications wheretable_name
  39. ='EMP';
  40.  
  41.    INSERTS    UPDATES    DELETES
  42. ---------- ---------- ----------
  43.          0         14          0
  44.  
  45. SQL>

6. 在Oracle10g版本(包括最新的10.2.0.4)中沒有已知的修改10%這個閥值的方法。但是在Oracle11g中則提供了SET_TABLE_PREFS等函數。

以下命令將指定表的STALE默認值從10%改爲5%,該值可以從新的dba_tab_stat_prefs數據字典中查詢獲得。

  1. --僅限於Oracle11g版本
  2. BEGIN
  3.   DBMS_STATS.SET_TABLE_PREFS ( ownname =>'KAMUS'tabname =>'T1'pname=>'STALE_PERCENT'pvalue =>'5');
  4. END;
  5. /
  6.  
  7. SQLselect * from dba_tab_stat_prefs;
  8.  
  9. OWNER      TABLE_NAME PREFERENCE_NAME      PREFE
  10. ---------- ---------- -------------------- -----
  11. KAMUS      T1         STALE_PERCENT        5

7. 在Oracle10g中運行以下命令,可以禁用統計信息自動收集功能。

  1. BEGIN
  2.   DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');
  3. END;
  4. /

發佈了50 篇原創文章 · 獲贊 13 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章