我遇到了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”有助于解决问题。问题是我无法在实际应用中添加此提示,如上所述。
答案 0 :(得分:2)
如果您对问题的描述是准确的,那么听起来它可能是一个优化器错误。也许冗余条件处理不当并导致使用不正确的过滤器。我要做的第一件事是查看完整查询的执行计划和没有“12/13/2011”条件的查询,并查找差异,特别是在应用的谓词中。
答案 1 :(得分:1)
在这种情况下,优化器会出错。由于您在11gR2上运行,因此无论统计信息发生了什么,您都可以使用SPM强制优化器对sql使用相同的接受计划。
启用sql计划管理,接受正确的计划并将其修复。不要忘记记录原因,通常我们不希望有FIXED计划。见Using SQL Plan Management 详情。
答案 2 :(得分:0)
this_.order_date <=
可能需要两行,但也会评估其他条件。因此,其他条件之一是false
。
答案 3 :(得分:0)
有两种方法可以过滤掉记录:
该语句的两个版本上的EXPLAIN PLAN可能会显示如何应用过滤。
但我会尝试删除“DISTINCT”关键字以及过滤器,看看它有什么不同。是否可能有多个记录共享相同的值(flight_trip_orders.id和flight_trip_orders.order_date)但具有不同的work_info_id?然后DISTINCT中的哪一个会被切断?