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

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