【问题标题】:Issue with date comparison in Oracle 11.2.0.2.0Oracle 11.2.0.2.0 中的日期比较问题
【发布时间】:2011-12-17 16:46:12
【问题描述】:

我遇到了 Oracle DBMS 的奇怪行为。 使用下面引用的 SQL,结果集为空。如果我删除“this_.order_date >=" 条件中的任何一个 - 它会返回预期的 2 行。

SELECT DISTINCT this_.id AS y0_,
   this_.order_date         AS y1_
 FROM flight_trip_orders this_,
   int_work_order_info iwoi1_,
   state_history_records cs2_
 WHERE this_.work_info_id           =iwoi1_.id
 AND iwoi1_.state_history_records_id=cs2_.id
 AND this_.order_date              <=to_timestamp('12/16/2011', 'mm/dd/yyyy')
 AND this_.order_date              >=to_timestamp('12/13/2011', 'mm/dd/yyyy')
 AND this_.order_date              >=to_timestamp('12/15/2011', 'mm/dd/yyyy')
 AND rownum <=2;

这怎么会发生?查询的结果在两个不同的 Oracle 实例上不同,但都是 11.2.0.2.0 版本

请不要建议优化查询和删除条件 - 查询已生成,我无权更改它。

编辑: 添加提示“ALL_ROWS”有助于解决此问题。问题是我无法在实际应用中添加这个提示,如上所述。

【问题讨论】:

  • 您是否指的是 ">=" 条件中的任何一个?因为只有一个“
  • @DmitrySidorenko:您能否编辑问题以包含修改后的查询有效时返回的数据?
  • @Glenn,你是对的,">="
  • &gt;=to_timestamp('12/13/2011', 'mm/dd/yyyy') AND &gt;=to_timestamp('12/15/2011' 没有任何意义。 >= '12/13/2011' 仅适用于与第二个条件匹配的行。所以不需要第一个&gt;= '12/13/2011'
  • @a_horse_with_no_name,谢谢,我知道了。

标签: sql oracle oracle11g


【解决方案1】:

如果您对问题的描述准确,则听起来可能是优化器错误。也许冗余条件处理不当并导致使用不正确的过滤器。我要做的第一件事是查看完整查询和没有“2011 年 12 月 13 日”条件的查询的执行计划,并寻找差异,特别是在应用的谓词中。

【讨论】:

  • 这实际上是优化器问题。 Oracle 自动重新评估执行计划,问题消失了。
【解决方案2】:

在这种情况下,优化器会出错。由于您在 11gR2 上运行,因此您可以使用 SPM 强制优化器对 sql 使用相同的 - 接受的 - 计划,而不管统计数据会发生什么。

启用 sql 计划管理,接受您的正确计划并进行修复。不要忘记记录原因,通常我们不希望有 FIXED 计划。见Using SQL Plan Management 了解详情。

【讨论】:

    【解决方案3】:

    this_.order_date &lt;= 可能需要两行,但也会评估其他条件。所以,其他条件之一是false

    【讨论】:

      【解决方案4】:

      过滤记录有两种方式:

      • 带有 WHERE 条件
      • 通过与其他表的联接:int_work_order_info 和 state_history_records

      两个版本的语句的解释计划可能会显示如何应用过滤。

      但我会尝试删除“DISTINCT”关键字以及过滤器,看看它有什么不同。是否有可能有多个记录共享(flight_trip_orders.id 和 flight_trip_orders.order_date)的相同值但具有不同的 work_info_id?那么 DISTINCT 会砍掉哪些?

      【讨论】:

      • 格伦,感谢您的回答。我尝试删除 DISTINCT,实际上这也是我的第一个猜测。没有帮助。
      • 您是否尝试过删除“DISTINCT”,然后向后移动删除 state_history_records 连接,查看结果,然后删除 int_work_order_info 连接?
      • 这方面有什么进展吗?这是一个非常有趣的谜题。我很想知道是什么原因造成的。
      • 好吧,添加 ALL_ROWS 提示有助于解决 SQL 的问题,但没有帮助解决问题,因为我无法以这种方式更改 SQL。这个问题不时神奇地消失。似乎与 Oracle 统计重新收集或类似的东西有关。如果您有兴趣,我可以在这里发布 EXPLAIN PLAN。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      相关资源
      最近更新 更多