- 最后登录
- 2015-4-9
- 在线时间
- 114 小时
- 威望
- 334
- 金钱
- 9852
- 注册时间
- 2011-11-16
- 阅读权限
- 60
- 帖子
- 158
- 精华
- 0
- 积分
- 334
- UID
- 94
|
7#
发表于 2013-1-18 14:17:17
缺少统计信息的对象很容易理解,就是尚未收集过统计信息的对象,如新创建的表和索引等。统计信息已过时的对象在10g中定义为至少10%的数据行被更改过的对象。那么,Oracle是如何知道一个对象如表的数据更改超过了10%了呢?答案 是表监控(Table Monitoring),当STATISTICS_LEVEL参数为TYPICAL或ALL时,Oracle会启动表监控,将对表的更改操作记录到数 据字典中,在收集统计信息时查询这些数据字典来决定某个表的统计信息是否已过时。我们可以通过查询数据字典视图all_tab_modifications,dba_tab_modifications或user_tab_modifications来查看某个表的更改记录,包括insert,update,delete,truncate,drop segement等操作。
- SQL> create table t as select * from dba_objects where rownum<100;
- 表已创建。
- SQL> exec dbms_stats.gather_table_stats('SONG','T'); --收集表的统计信息
- PL/SQL 过程已成功完成。
- SQL> select TABLE_NAME, STALE_STATS from user_tab_statistics where table_name =
- 'T';
- TABLE_NAME STA
- ------------------------------ ---
- T NO --统计信息是新鲜的
- SQL> insert into t select * from t;
- 已创建99行。
- SQL> commit;
- 提交完成。
- SQL> select TABLE_NAME, STALE_STATS from user_tab_statistics where table_name =
- 'T';
- TABLE_NAME STA
- ------------------------------ ---
- T NO --插入之后还是新鲜的,因为oracle内部收集的延时
- SQL> exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO; --刷新上面提到的 延时收集
- PL/SQL 过程已成功完成。
- SQL> select * from user_tab_modifications where table_name='T';
- TABLE_NAME PARTITION_NAME
- ------------------------------ ------------------------------
- SUBPARTITION_NAME INSERTS UPDATES DELETES TIMESTAMP
- ------------------------------ ---------- ---------- ---------- --------------
- TRU DROP_SEGMENTS
- --- -------------
- T
- 99 0 0 26-6月 -12 --99表明插入了99行
- NO 0
- SQL> select TABLE_NAME, STALE_STATS from user_tab_statistics where table_name =
- 'T';
- TABLE_NAME STA
- ------------------------------ ---
- T YES -- 此表的统计信息标记为 过时
复制代码 |
|