【DB笔试面试650】在Oracle中,如何查询表的DML操作数据变化量?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lihuarongaini/article/details/101443804

640?wx_fmt=gif

题目 部分

在Oracle中,如何查询表的DML操作数据变化量?

     

答案部分

DBA_TAB_MODIFICATIONS视图(基表为SYS.MON_MODS_ALL$)记录了从上次收集统计信息以来表中DML操作变化的数据量,包括执行INSERTUPDATEDELETE影响的行数,以及是否执行过TRUNCATE操作。另外,DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO可以将内存(SGA)中的数据快速刷新到数据字典SYS.MON_MODS_ALL$中。

其实,SYS.MON_MODS_ALL$只是最终表,中间还有一个过渡表SYS.MON_MODS$,这两个表的结构是完全相同的。从Oracle 10g开始,当初始化参数STATISTICS_LEVEL的值被设置为TYPICALALL时,默认会启用Oracle中表监控的特性,此时,Oracle会默认监控表上的自上一次分析(Last Analyzed)之后发生的INSERTUPDATEDELETE以及表是否被TRUNCATE截断操作,并且Oracle数据库的SMON后台进程每15分钟会将这些操作数量的近似值(内存SGA中记录的DML操作)写入到数据字典基表MON_MODS$中(从SGA中写入到MON_MOD$),但是这个写入过程只持续1分钟,因此,可能不是所有DML操作都会记录到MON_MODS$表中。在默认情况下,数据库每天会将SGA中表的DML操作和MON_MODS$表的数据合并(MERGE)到MON_MODS_ALL$中,也可以通过DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO来手动写入到MON_MODS_ALL$中。在收集统计信息后,MON_MODS_ALL$表中信息将被清空。需要注意的是,在作者实际测试过程中发现,Oracle并不是严格按照每15分钟将SGA中的DML刷新到MON_MODS$表中,而且也不是严格按照每天1次的规律刷新MON_MODS$表的数据到MON_MODS_ALL$中。所以,DBA只需要知道,DML数据是SMON进程从SGA中刷新到SYS.MON_MODS$中,然后按照一定的时间规则刷新到SYS.MON_MODS_ALL$表中即可。

640?wx_fmt=png

 

Oracle 10g以前可以使用MONITORINGNOMONITORING这两个选项来控制表级别的监控是否被开启(ALTER TABLE ... MONITORING),此外还可以通过DBMS_STATS.ALTER_SCHEMA_TAB_MONITORING存储过程在SCHEMA级别开启MONITORING,但是从Oracle 10g开始这些方法不再有效,MONITORINGNOMONITORING选项被废弃,其原有功能被STATISTICS_LEVEL参数所覆盖。虽然语句“ALTER TABLE TB_NAME NOMONITORING;”可以执行,但是,执行后表TB_NAMEMONITORING属性依然为YES。表的MONITORING特性现在完全由STATISTICS_LEVEL参数所控制:当STATISTICS_LEVEL设置为BASIC时,表的MONITORING将被禁用;当STATISTICS_LEVEL设置为TYPICALALL时,表的MONITORING特性将被启用。所以,可以通过设置参数STATISTICS_LEVELBASIC来禁止SMON后台进程收集DML的操作统计数据。但是,如果参数STATISTICS_LEVEL设置为BASIC,那么Oracle很多功能将不能使用,例如AMMASMMAWRASHADDM等。因此,在一般情况下,并不建议修改该参数的值。

Oracle 10g之前,建表之后默认为NOMONITORING,从Oracle 10g开始,建表之后默认为MONITORING

 1[oracle@rhel6lhr env_oracle]$ sqlplus / as sysdba
 2
 3SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 19 13:49:38 2017
 4
 5Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 6
 7
 8Connected to:
 9Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
10With the Partitioning, OLAP and Data Mining options
11
12SYS@ora10g> CREATE TABLE TEST_MON_MODS2 AS SELECT * FROM USER_TABLES;
13Table created.
14
15SYS@ora10g> ALTER TABLE TEST_MON_MODS2 NOMONITORING;
16Table altered.
17
18SYS@ora10g> 
19SYS@ora10g> SELECT D.MONITORING FROM DBA_TABLES D WHERE D.TABLE_NAME='TEST_MON_MODS2';
20
21MON
22---
23YES

示例如下:

扫描二维码关注公众号,回复: 7563729 查看本文章
 1SYS@orclasm > CREATE TABLE T_MON_20170602_LHR AS SELECT * FROM DBA_OBJECTS;
 2Table created.
 3SYS@orclasm > SELECT TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP FROM USER_TAB_MODIFICATIONS WHERE TABLE_NAME='T_MON_20170602_LHR';
 4no rows selected
 5SYS@orclasm > EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'T_MON_20170602_LHR');
 6PL/SQL procedure successfully completed.
 7SYS@orclasm > SELECT TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP FROM USER_TAB_MODIFICATIONS WHERE TABLE_NAME='T_MON_20170602_LHR';
 8no rows selected
 9SYS@orclasm > DELETE FROM T_MON_20170602_LHR WHERE ROWNUM <=10000;
1010000 rows deleted.
11SYS@orclasm > COMMIT;
12Commit complete.
13SYS@orclasm > SELECT TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP FROM USER_TAB_MODIFICATIONS WHERE TABLE_NAME='T_MON_20170602_LHR';
14no rows selected
15SYS@orclasm > EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
16PL/SQL procedure successfully completed.
17SYS@orclasm > SELECT TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP  FROM USER_TAB_MODIFICATIONS WHERE TABLE_NAME='T_MON_20170602_LHR';
18TABLE_NAME                        INSERTS    UPDATES    DELETES TIMESTAMP
19------------------------------ ---------- ---------- ---------- -------------------
20T_MON_20170602_LHR                      0          0      10000 2017-06-02 19:26:03

 

& 说明:

有关SYS.MON_MODS$SYS.MON_MODS_ALL$DBA_TAB_MODIFICATIONS的更多内容可以参考作者BLOGhttp://blog.itpub.net/26736162/viewspace-2145157/

 

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

640?wx_fmt=gif

---------------优质麦课------------

640?wx_fmt=png

详细内容可以添加麦老师微信或QQ私聊。

640?wx_fmt=gif

About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

640?wx_fmt=gifDBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

640?wx_fmt=gif

640?wx_fmt=gif

640?wx_fmt=png

猜你喜欢

转载自blog.csdn.net/lihuarongaini/article/details/101443804
今日推荐