关于DBA_TAB_MODIFICATIONS(转)
Posted wenzhongyan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于DBA_TAB_MODIFICATIONS(转)相关的知识,希望对你有一定的参考价值。
DBA_TAB_MODIFICATIONS使用来记录表的dml操作,依靠里面的信息确定统计信息是否陈旧。确定表是否需要统计分析的依据。系统后台调用DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO更新,当然也可以手工调用更新信息。1.测试环境:
SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> create table t nologging nomonitoring as select rownum id,'test' name from dual connect by level <=10;
Table created.
--我的测试环境是打开archive log的。
2.开始测试:
说明一下:exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO,都是在另外的会话下执行。避免隐式提交。
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
no rows selected
--执行更新
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
no rows selected
--可以发现没有信息。会不会建立表设置了nomonitor属性呢?
SQL> insert into t values(11,'a'); --不提交
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
PL/SQL procedure successfully completed.
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
TABLE_OWNE TABLE_NAME INSERTS UPDATES DELETES TIMESTAMP TRU DROP_SEGMENTS
---------- ------------------------------ ---------- ---------- ---------- ------------------- --- -------------
SCOTT T 1 0 0 2012-02-09 09:12:56 NO 0
--可以发现,即使不commit,只要执行DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO刷新了,视图sys.dba_tab_modifications都会有记录。
--另外也可以发现即使在这个版本11GR2下,表没有打开nomonitoring,依旧会记录这些信息。据说9i下不会,我没有测试!
--另外ctas建立的表,开始的插入信息没有记录。
--这样看来这个统计精确,比较困难。
做一个Direct insert 看看是否会记录信息:
SQL> insert /*+ append */ into t select rownum+11,'b' from dual connect by level <=10;
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
PL/SQL procedure successfully completed.
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
TABLE_OWNE TABLE_NAME INSERTS UPDATES DELETES TIMESTAMP TRU DROP_SEGMENTS
---------- ------------------------------ ---------- ---------- ---------- ------------------- --- -------------
SCOTT T 11 0 0 2012-02-09 10:03:27 NO 0
--可以发现,即使做Direct insert系统也在sys.dba_tab_modifications会记录。注意表的建立属性nologging.
--做统计分析:
SQL> exec dbms_stats.gather_table_stats(OWNNAME =>user,TABNAME =>'T');
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
no rows selected
--可以发现一旦分析,信息就会从视图消失。从基表SYS.mon_mods_all$删除了。
--做一些dml操作看看:
SQL> update t set name='c' where id=1;
1 row updated.
SQL> delete from t where id=2;
1 row deleted.
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
PL/SQL procedure successfully completed.
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
TABLE_OWNE TABLE_NAME INSERTS UPDATES DELETES TIMESTAMP TRU DROP_SEGMENTS
---------- ------------------------------ ---------- ---------- ---------- ------------------- --- -------------
SCOTT T 0 1 1 2012-02-09 10:21:44 NO 0
--记录正确!
3.修改隐含参数看看
SQL> @hide monitor
old 10: and a.ksppinm like '%&1%'
new 10: and a.ksppinm like '%monitor%'
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
---------------------------------------- ------------------------------------------------------------------ ---------------------- ---------------------- ----------------------
_cache_stats_monitor if TRUE, enable cache stats monitoring TRUE FALSE FALSE
_dml_monitoring_enabled enable modification monitoring TRUE TRUE TRUE
SQL> alter session set "_dml_monitoring_enabled"=false scope=memory;;
alter session set "_dml_monitoring_enabled"=false
*
ERROR at line 1:
ORA-02096: specified initialization parameter is not modifiable with this option
SQL> alter system set "_dml_monitoring_enabled"=false scope=memory;;
System altered.
SQL> insert into t values(22,'d');
1 row created.
SQL> commit ;
Commit complete.
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
PL/SQL procedure successfully completed.
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='T';
TABLE_OWNER TABLE_NAME INSERTS UPDATES DELETES TIMESTAMP TRU DROP_SEGMENTS
------------ ------------------------------ ---------- ---------- ---------- ------------------- --- -------------
SCOTT T 0 1 1 2012-02-09 10:21:44 NO 0
--可以发现仅仅设置隐含参数_dml_monitoring_enabled,就不会有记录了。
修改回来:
SQL> alter system set "_dml_monitoring_enabled"=true scope=memory; ;
总结:
1.ctas建立的插入信息不记录。
2.即使作了dml操作,如果没有commit,在刷新后exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO,sys.dba_tab_modifications也会存在记录。
3.direct insert也会记录。
4.分析表后记录信息会消失。
5.仅仅隐含参数_dml_monitoring_enabled可以关闭监测在11GR2下。
原帖地址:http://www.verydemo.com/demo_c326_i2363.html
以上是关于关于DBA_TAB_MODIFICATIONS(转)的主要内容,如果未能解决你的问题,请参考以下文章