关于DBA_TAB_MODIFICATIONS(转)

来源:互联网 发布:知乎 好书推荐 编辑:程序博客网 时间:2024/06/05 07:18
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

0 0
原创粉丝点击