目录
图灵小队—关于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 test.test2(id number,name varchar(10));
--未开启archive log list。
2.开始测试:
说明一下:exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO,都是在另外的会话下执行。避免隐式提交。
注意:条件首先要加上table_owner,如果只是使用table_name这个条件,好像都查不出来!!!!。
(1)查看当前记录
SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_owner='TEST’ and table_name='TEST2'; no rows selected
(2)执行更新
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_owner='TEST’ and table_name='TEST2';
--可以发现没有信息。会不会建立表设置了nomonitor属性呢?
SQL> insert into test2 values(1,'LLL'); --不提交 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='TEST2'; TABLE_OWNE TABLE_NAME INSERTS UPDATES DELETES TIMESTAMP TRU DROP_SEGMENTS ---------- ------------------------------ ---------- ---------- ---------- ------------------- --- ------------- TEST TEST2 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建立的表,开始的插入信息没有记录。
--这样看来这个统计精确,比较困难。
(3)做一个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='TEST2';TABLE_OWNE TABLE_NAME INSERTS UPDATES DELETES TIMESTAMP TRU DROP_SEGMENTS ---------- ------------------------------ ---------- ---------- ---------- ------------------- --- ------------- TEST TEST2 11 0 0 2012-02-09 10:03:27 NO 0
--可以发现,即使做Direct insert系统也在sys.dba_tab_modifications会记录。注意表的建立属性nologging.
(4)做统计分析
SQL> exec dbms_stats.gather_table_stats(OWNNAME =>TEST,TABNAME =>'TEST1'); SQL> select table_owner,table_name,inserts,UPDATES,deletes,timestamp,truncated,drop_segments from sys.dba_tab_modifications where table_name='TEST2';no rows selected
--可以发现一旦分析,信息就会从视图消失。从基表SYS.mon_mods_all$删除了。
(5)做一些dml操作看看:
SQL> update test.test1 set name='c' where id=1; 1 row updated. SQL> delete from test.test1 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 ---------- ------------------------------ ---------- ---------- ---------- ------------------- --- ------------- TEST TEST1 0 1 1 2012-02-09 10:21:44 NO 0
--记录正确!
3、修改隐含参数看看
(1)查看隐藏参数
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
(2)修改隐藏参数
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.
(3)进行插入操作
SQL> insert into test.test1 values(22,'d'); 1 row created. SQL> commit ; Commit complete.
(4)执行刷新
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 ------------ ------------------------------ ---------- ---------- ---------- ------------------- --- ------------- TEST TEST1 0 1 1 2012-02-09 10:21:44 NO 0
--可以发现仅仅设置隐含参数_dml_monitoring_enabled,就不会有记录了。
(5)修改回隐藏参数
SQL> alter system set "_dml_monitoring_enabled"=true scope=memory; ;
4、总结:
(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下。