oracle统计信息自动收集

DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC存储过程


Automatic Statistics Gathering


在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表中记录了所有被监控的表的数据量更改信息。该信息的更新将会稍微滞后于真实的修改,默认情况是15分钟更新,可以通过DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO存储过程来立刻将更改的信息更新到USER_TAB_MODIFICATIONS表中。对于更新之后再rollback的记录,仍然算为已经受影响的记录,Oracle不会在rollback之后再去更新USER_TAB_MODIFICATIONS表。


SQL> select * from user_tab_modifications wheretable_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 wheretable_name='EMP';


no rows selected


SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();


PL/SQL procedure successfully completed.


SQL> select inserts,updates,deletes fromuser_tab_modifications where table_name

='EMP';


   INSERTS    UPDATES   DELETES

---------- ---------- ----------

         0         14          0


SQL> rollback;


Rollback complete.


SQL> execDBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();


PL/SQL procedure successfully completed.


SQL> select inserts,updates,deletes fromuser_tab_modifications where table_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 ( wnname =>'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. 运行以下命令,可以禁用统计信息自动收集功能。

BEGIN

 DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

END;

/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前话:本文是对近两三周来对两本书籍的读后感小结,两本书分别为《SQL优化核心思想》《高性能SQL调优精要与案例解析...
    ve流星雨_f724阅读 460评论 0 0
  • 统计级别 show parameter statistics_level basic :自动优化功能会禁用 typ...
    个人精进成长营阅读 345评论 0 1
  • 统计信息自动执行需要以下条件满足杏彩源码搭建QQ2952777280: dba_autotask_task 字段s...
    客服_fc25阅读 332评论 0 0
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,290评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,122评论 0 4