我在Oracle(11g)上有一个分区表(MYTABLE)。这是一个非常大的表,由INSERT_DATE列(没有时间)分区。
问题是,Count(*)给出了错误的结果。
以下查询返回:5,726,829,673
SELECT count(*) FROM MYTABLE WHERE INSERT_DATE >= TO_DATE('01/01/2015', 'DD/MM/YYYY')
以下查询返回:13,076,228,720
SELECT SUM(1) FROM MYTABLE WHERE INSERT_DATE >= TO_DATE('01/01/2015', 'DD/MM/YYYY')
怎么可能?造成这种差异的原因是什么?
检查两个查询的执行计划的Note
部分 - 是否有计划管理功能导致查询使用完全不同的计划?运行explain plan for SELECT ...
然后select * from table(dbms_xplan.display);
以查明Oracle是否以不同方式运行查询。
例如,DBA可能在count(*)
版本上创建了一个SQL配置文件,强制优化器使用索引,并且该索引已损坏并需要重建。
或者一些邪恶的开发人员使用DBMS_ADVANCED_REWRITE
来逐字地更改查询文本,但只针对其中一个语句。检查DBA_REWRITE_EQUIVALENCES
中的任何条目。