现在的位置: 首页 > 综合 > 正文

oracle自动统计信息的收集原理及实验

2014年08月01日 ⁄ 综合 ⁄ 共 2039字 ⁄ 字号 评论关闭

        从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息。这个自动任务默认情况下在工作日晚上10:00-6:00和周末全天开启。

        调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。收集的规则是user_tab_modifications中操作的记录数超过表的数量的10%就会自动收集。更多的信息看官方文档:http://docs.oracle.com/cd/B19306_01/server.102/b14211/stats.htm#sthref1068 

       user_tab_modifications表中有inserts,updates,deletes,意思是修改了多少行数据,下面我们来做一个实验:

SQL> create table test as select * from dba_objects;

SQL> select table_name,inserts,updates,deletes,timestamp
      from user_tab_modifications where table_name='TEST';
未选定行

SQL> exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO;
PL/SQL 过程已成功完成。

SQL> select table_name,inserts,updates,deletes,timestamp
      from user_tab_modifications where table_name='TEST';
未选定行

SQL> exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO;
PL/SQL 过程已成功完成。

SQL> select table_name,inserts,updates,deletes,timestamp
      from user_tab_modifications where table_name='TEST';
未选定行

SQL> exec dbms_stats.gather_table_stats(user,'TEST');
PL/SQL 过程已成功完成。

SQL> select table_name,inserts,updates,deletes,timestamp
      from user_tab_modifications where table_name='TEST';
未选定行

SQL> delete from test where rownum <=10000;
已删除10000行。
SQL> commit;
提交完成。

SQL> select table_name,inserts,updates,deletes,timestamp
      from user_tab_modifications where table_name='TEST';
未选定行

SQL> exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO;
PL/SQL 过程已成功完成。

SQL> select table_name,inserts,updates,deletes,timestamp
      from user_tab_modifications where table_name='TEST';
TABLE_NAME                        INSERTS    UPDATES    DELETES TIMESTAMP
------------------------------ ---------- ---------- ---------- --------------
TEST                                    0          0     1000012-7月 -13

 

另外:

     关闭自动统计信息命令,exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

     启用自动统计信息命令,exec DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB');

     查看自动统计信息是否开启,

     oracle 10g :SELECT OWNER,JOB_NAME,ENABLED FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'GATHER_STATS_JOB'; 
     oracle 11g :select t1.owner, t1.job_name, t1.enabled  from dba_scheduler_jobs t1   where t1.job_name = 'BSLN_MAINTAIN_STATS_JOB';

抱歉!评论已关闭.