create table test_modifications(id int);
begin
for i in 1..200000 loop
insert into test_modifications values(i);
end loop;
commit;
end;
alter system set 'MONITOR_MODIFICATIONS'=2 both; --MONITOR_MODIFICATIONS参数为2,对指定的表进行监控
--设置需要监控的表
DBMS_STATS.SET_TABLE_PREFS('SYSDBA','TEST_MODIFICATIONS','MONITOR_MODIFICATIONS_FLAG','TRUE');
--取消监控的表
DBMS_STATS.SET_TABLE_PREFS('SYSDBA','TEST_MODIFICATIONS','MONITOR_MODIFICATIONS_FLAG','FALSE');
alter system set 'MON_CHECK_INTERVAL'=5 both;
设置5秒,即每过5秒数便将用户表对象的数据变化情况记录到SYSMODIFICATIONS系统表中 ,单位为秒,默认3600S一个小时。
begin
for i in 1..200000 loop
insert into test_modifications values(i);
end loop;
commit;
end;
Inserts:表示,监控打开以来,插入行数。
PART_INSERTS:表示,监控打开以来,受统计信息影响,插入的行数。
1、select count() from test_modifications;
COUNT()
400000
2、delete from test_modifications ;
执行成功, 执行耗时1秒 139毫秒. 执行号:14965
影响了400,000条记录
Commit;
再次查询SYSMODIFICATIONS
此时在做一个统计信息的收集
DBMS_STATS.GATHER_TABLE_STATS(user,'TEST_MODIFICATIONS',NULL,100,FALSE,'FOR ALL COLUMNS SIZE AUTO',8);;
查询SYSMODIFICATIONS
发现PART_INSERTS记录的值已经被清空。
视图all_tab_modifications、dba_tab_modifications、user_tab_modifications,用以展示上次收集统计信息以来表中的dml操作变化的数据量,包括insert、update、 delete影响的行数,是否执行过truncate操作,以及分区表删除子表的个数。
系统表:SYSMODIFICATIONS,用以记录所有用户表对象的数据变化情况。
sp_flush_modifications_info:将监控信息刷新到系统表中。
SP_CLEAN_MODIFICATIONS:清理系统表SYSMODIFICATIONS中的冗余数据,将已经不存在的对象从该系统表中清除。
dbms_stats新增属性monitor_modifications_rm_pln_flag设置监控表移除计划缓存的数据变化阀值,监控表达到数据变化阈值,增加移除对象计划缓存处理。
文章
阅读量
获赞