DBMS_STATS.GATHER_SCHEMA_STATS收集信息不准确
Nov022011
今天在做数据库试迁移的时候,利用DBMS_STATS.GATHER_SCHEMA_STATS收集信息后,发现新数据库(linux+oracle11gR2)和老数据库(Windows server2003+oracle10gR2)有6张表的数据对不上,比老系统的数据库表行数要少。
SQL> exec dbms_stats.gather_schema_stats(user); PL/SQL procedure successfully completed. SQL> select table_name,num_rows from user_tables where table_name='LOG'; TABLE_NAME NUM_ROWS ------------------------------ ---------- LOG 3176994
查看EXPDP和IMPDP日志,导出和导入的数据是吻合的。
. . 导出了 "THAMS"."LOG" 274.2 MB 3204300 行 . . imported "THAMS"."LOG" 274.2 MB 3204300 rows
直接查看LOG表的行数,也是对的。
SQL> select count(*) from log; COUNT(*) ---------- 3204300
由于数据量对不上的6张表都超过了百万条记录,DBMS_STATS.GATHER_SCHEMA_STATS只是能良好的估量统计信息,并不是绝对的准确,在老系统数据库查询之后,除了LOG表,其他表的数据也都对。
SQL> select count(*) from log; COUNT(*) ---------- 3206132
可是为什么3206132条记录EXPDP只导出了3204300条记录,通过查看LOG表后得出结论,由于是试迁移,老系统程序并未停止,一直有用户在使用,LOG表一直在记录这些用户的操作信息,所以LOG表数据一直在增长,在做EXPDP操作之后,LOG表从3204300条记录增长到3206132条。