【问题标题】:Oracle Partitioned Table - How to CountOracle 分区表 - 如何计数
【发布时间】:2017-12-31 10:31:57
【问题描述】:

我在 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')

这怎么可能?造成这种差异的原因是什么?

【问题讨论】:

  • 我可能有个主意。你的确切 11g 版本是什么? SELECT * FROM V$VERSION
  • 它是 Exadata 机器。详细信息包括:Oracle 数据库 11g 企业版版本 11.2.0.4.0 - 64 位生产 PL/SQL 版本 11.2.0.4.0 - 生产 CORE 11.2.0.4.0 适用于 Linux 的生产 TNS:版本 11.2.0.4.0 - 生产 NLSRTL 版本 11.2 .0.4.0 - 生产
  • 这里也一样。我以为您遇到了影响版本 11.2.0.111.2.0.2Bug 9857247 Wrong results for count(*) with group by placement,但事实并非如此,因为它已在 11.2.0.3 。很奇怪,想知道是否有人作为解释......
  • 这些数字有可能落后吗? (数数越大?)

标签: oracle oracle11g partitioning


【解决方案1】:

检查两个查询的执行计划的Note 部分 - 是否有计划管理功能导致查询使用完全不同的计划?运行 explain plan for SELECT ...,然后运行 ​​select * from table(dbms_xplan.display); 以了解 Oracle 运行查询的方式是否不同。

例如,DBA 可能在 count(*) 版本上创建了 SQL 配置文件,强制优化器使用索引,而该索引已损坏,需要重建。

或者一些邪恶的开发者使用DBMS_ADVANCED_REWRITE 来改变查询文本,但只针对其中一个语句。检查DBA_REWRITE_EQUIVALENCES 中的任何条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多