Oracle 视图学习--dba_tab_modifications

今天做数据库性能测试,研究数据库的统计信息如何过期的时候,发现在dba_tab_modifications中无法查看到表的更改记录,特此记录。

试验过程如下:

--查看视图是否已经存在记录
select * from dba_tab_modifications a where a.table_NAME = 'TEST1';

--1. 创建测试表
create table test1 as select * from dba_objects where 1<>1;

--2.检查
select * from test1;

no rows selected
--3.插入数据
insert into test1  select * from dba_objects;

commit;
--4.收集统计信息
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',
                                tabname          => 'TEST1',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size 1',
                                no_invalidate    => FALSE,
                                degree           => 1,
                                cascade          => TRUE);
END;
/

PL/SQL procedure successfully completed.
--5.查看统计信息
select A.owner, A.table_name, A.num_distinct, A.num_nulls, A.last_analyzed
  from dba_tab_col_statistics a
 where a.owner = 'SCOTT'
   and a.table_name = 'TEST1';

OWNER                TABLE_NAME                               NUM_DISTINCT  NUM_NULLS LAST_ANALYZED
-------------------- ---------------------------------------- ------------ ---------- ------------------
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21
SCOTT                TEST1                                               0          0 16-JUN-21

15 rows selected.
 

--6.删除数据
delete from test1 where object_id > 1000;

--7.检查dba
select table_owner,table_name,inserts,updates,deletes,timestamp from dba_tab_modifications b where b.table_owner = 'SCOTT' and table_name='TEST1';
no rows selected

--8.插入数据
insert into test1  select * from dba_objects where object_id >10000 and object_id < 13000;
commit;

--9.更新数据
update test1  set  owner = 'SCOTT' ;
commit;

--10.检查表的修改记录
select table_owner,table_name,inserts,updates,deletes,timestamp from dba_tab_modifications b where b.table_owner = 'SCOTT' and table_name='TEST1';
no rows

--11.刷新监控,依然没有结果
exec dbms_stats.flush_database_monitoring_info;
PL/SQL procedure successfully completed.

select table_owner,table_name,inserts,updates,deletes,timestamp from dba_tab_modifications b where b.table_owner = 'SCOTT' and table_name='TEST1';

no rows selected

查看mos这个可能是个bug
Querying DBA_TAB_MODIFICATIONS Does Not Return Rows Without WHERE Clause (Doc ID 2427546.1)
Applies to:
Oracle Database - Enterprise Edition - Version 11.2.0.3 to 12.1.0.1 [Release 11.2 to 12.1]
Information in this document applies to any platform.
Symptoms
Querying DBA_TAB_MODIFICATIONS without a WHERE clause returns no rows. 
SQL> SELECT * FROM DBA_TAB_MODIFICATIONS;
no rows selected 
Cause:
This issue occurs when join factorization is enabled, UNION ALL query block has at least 3 branches and there are at least 2 join (factorization) predicates.
Solution:
Workaround:
Set the _optimizer_join_factorization parameter value to false:
alter session set "_optimizer_join_factorization" = false;
then re-run the query.
Permanent Solution:
Apply patch 13984324.
This issue is permanently fixed in RDBMS 12.1.0.1 base release.


解决方法:
"_optimizer_join_factorization"=false

SQL> alter session set "_optimizer_join_factorization" = false;
Session altered.


SQL> create table test2 as select * from dba_objects where 1<>1;
Table created.


SQL> select * from test2;
no rows selected


SQL> insert into test2  select * from dba_objects;
87031 rows created.
SQL> commit;
Commit complete.


SQL> delete from test2 where object_id > 1000;
commit;
86032 rows deleted.
Commit complete.


SQL> insert into test2  select * from dba_objects where object_id >10000 and object_id < 13000;
commit;
2999 rows created.
Commit complete.


SQL> update test2  set  owner = 'SCOTT' ;
commit;
3998 rows updated.
Commit complete.


SQL> select table_owner,table_name,inserts,updates,deletes,timestamp from dba_tab_modifications b where b.table_owner = 'SCOTT' and table_name='TEST2';
no rows selected


SQL> exec dbms_stats.flush_database_monitoring_info;
PL/SQL procedure successfully completed.


SQL> select table_owner,table_name,inserts,updates,deletes,timestamp from dba_tab_modifications b where b.table_owner = 'SCOTT' and table_name='TEST2';
TABLE_OWNER          TABLE_NAME                                  INSERTS    UPDATES    DELETES TIMESTAMP
-------------------- ---------------------------------------- ---------- ---------- ---------- ------------------
SCOTT                TEST2                                         90030       3998      86032 16-JUN-21 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值