有没有办法可以跟踪 Oracle 中修改后的表?
是否有一个主表来跟踪所有其他表的行?例如,如果我向 table1 添加一行,它将更新行数,说明 table1 现在有 5 行。
我正在考虑跟踪dba_tables
或all_tables
或,user_tables
但我不确定哪个实际计算每个表的行数。
通过将它们与表监控收集的信息相结合,您可以对刚刚查询的 user/all/dba_statistics 进行改进。
视图 DBA/ALL/USER_TAB_MODIFICATIONS 填充了自上次收集统计信息以来表上的插入、更新、删除和截断数。视图是异步填充的,因此调用 DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO 将最新的内存数据刷新到表中。
请记住,统计数据本身可能是估计的,尽管在大多数表上准确度都非常好,即使估计百分比低得惊人(甚至低至 5% 或更低),但如果您需要准确的数字,则必须查询带有 count(*) 的表本身。您可以将一个流水线函数放在一起,通过单个查询对多个表执行此操作。
SELECT TABLE_NAME, NUM_ROWS
FROM USER_TABLES
我非常怀疑您实际上使用的是 Oracle 3.1。此查询至少在 11g 中有效(我目前没有其他实例要测试)。
请记住,这是一个数据字典表,在您在任何模式表中插入一行后,它不会自动更新。必须运行 Gather Statistics 过程来更新这些记录。
唯一的区别dba|user|all_tables
是范围。user_tables
将输出限制为您拥有的表,all_tables
基本上是user_tables
+ 来自您已被授予访问权限的其他模式的表,并且dba_tables
是数据库中存在的所有内容。
num_rows
是跟踪表中行数的有效选项。不幸的是,它不是实时计算的,而是作为表统计收集操作的一部分。我知道没有实时跟踪行数的开箱即用选项。