Oracle 11.2.0.2.0中的日期比较问题

时间:2011-12-15 13:25:27

标签: sql oracle oracle11g

我遇到了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”有助于解决问题。问题是我无法在实际应用中添加此提示,如上所述。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在这种情况下,优化器会出错。由于您在11gR2上运行,因此无论统计信息发生了什么,您都可以使用SPM强制优化器对sql使用相同的接受计划。

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

答案 2 :(得分:0)

this_.order_date <=可能需要两行,但也会评估其他条件。因此,其他条件之一是false

答案 3 :(得分:0)

有两种方法可以过滤掉记录:

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

该语句的两个版本上的EXPLAIN PLAN可能会显示如何应用过滤。

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