我在 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
中的任何条目。
关于Oracle 分区表 - 如何计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304296/