Oracle 11g自動收集統計信息

收集機制:

    DBA_TAB_MODIFICATIONS視圖(基表爲SYS.MON_MODS_ALL$)記錄了從上次收集統計信息以來表中DML操作變化的數據量,包括執行INSERT、UPDATE和DELETE影響的行數,以及是否執行過TRUNCATE操作。另外,DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO可以將內存中的數據快速刷新到數據字典SYS.MON_MODS_ALL$中。

    在Oracle 10g中,如果表中變更的行數(字典表SYS.MON_MODS_ALL$中記錄的INSERT++DELETE的總數)超過表的總行數(SYS.TAB$中記錄的目標表總記錄數)的10%時或自上次自動統計信息收集作業完成之後目標表被執行過TRUNCATE操作,那麼該表的統計信息就變爲陳舊狀態,Oracle就會在指定時間段自動收集統計信息。

    在Oracle 10g中,這個10%(STALE_PERCENT)是無法修改的,如果表非常大,那麼10%其實是非常多的數據,這就造成統計信息不準確。在Oracle 11g中,這個10%(STALE_PERCENT)是可以修改的,分爲全局(DBMS_STATS.SET_GLOBAL_PREFS)、數據庫級別(DBMS_STATS.SET_DATABASE_PREFS)、用戶級別(DBMS_STATS.SET_SCHEMA_PREFS)和表級別(DBMS_STATS.SET_TABLE_PREFS)。其中,數據庫級別和用戶級別都是調用表級別的存儲過程DBMS_STATS.SET_TABLE_PREFS來對錶進行設置的。

表級別的設定如下所示:
    修改爲5%(範圍從1-100):EXEC DBMS_STATS.SET_TABLE_PREFS(USER,'TABLE_NAME','STALE_PERCENT',5);
    恢復爲10%:    EXEC DBMS_STATS.SET_TABLE_PREFS(USER,'TABLE_NAME','STALE_PERCENT',NULL);
    查詢表百分比:SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT',USER,'TABLE_NAME') FROM DUAL;
    查詢全局百分比:SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT') FROM DUAL;

查詢全局自動收集參數:

    select dbms_stats.get_prefs('method_opt'),--統計量收集
        dbms_stats.get_prefs('concurrent'),--併發
        dbms_stats.get_prefs('GRANULARITY'),----粒度
        dbms_stats.get_prefs('INCREMENTAL')---分區表只數據變動分區
   from dual;

定時收集:

--查詢統計信息的收集所對應的task
SELECT t.*
  FROM dba_autotask_task t
 where t.CLIENT_NAME = 'auto optimizer stats collection';

--查詢統計信息的收集所對應的調度程序
SELECT t.*
  FROM dba_scheduler_programs t
 where t.PROGRAM_NAME = 'GATHER_STATS_PROG';

select *
  from dba_autotask_client a
 where a.CLIENT_NAME = 'auto optimizer stats collection';

--查詢task的窗口
SELECT t.* FROM dba_autotask_window_clients t;
SELECT t.* FROM dba_scheduler_windows t where enabled = 'TRUE';

--查詢定時任務執行
SELECT *
  FROM dba_scheduler_job_run_details t
 where t.JOB_NAME like 'ORA$AT_OS_OPT_%'
 order by t.LOG_DATE desc;


參考:https://blog.csdn.net/lihuarongaini/article/details/100179574

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章