2011-12-15 42 views
2

我遇到了Oracle DBMS的奇怪行爲。 以下引用的SQL結果集爲空。如果我刪除了「this_.order_date> =」條件 - 它會返回預期的2行。問題與Oracle 11.2.0.2.0中的日期比較

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」有助於解決問題。問題在於,我無法在實際應用中添加此提示,如上所述。

+2

您是不是指「> =」條件?因爲只有一個「<=」條件,並且刪除允許未來任何日期記錄的條件。 – Glenn 2011-12-15 13:43:30

+1

@DmitrySidorenko:您可以編輯問題以包含在修改後的查詢工作時返回的數據嗎? – 2011-12-15 14:06:05

+1

@Glenn,你是對的,「> =」 – 2011-12-15 14:19:58

回答

2

如果你對這個問題的描述是準確的,這聽起來像它可能是一個優化器錯誤。也許冗餘條件處理不好,導致使用不正確的過濾器。我要做的第一件事是查看完整查詢和沒有「12/13/2011」條件的查詢的執行計劃,並查找差異,特別是在應用的謂詞中。

0

this_.order_date <=可能預期兩行,但其他條件也會被評估。所以,其他條件之一是false

0

有兩種方法記錄被過濾掉:

  • 與WHERE條件
  • 通過加入與其他表:int_work_order_info和state_history_records

的EXPLAIN兩個版本計劃的聲明可能會顯示如何應用過濾。

但我會嘗試刪除「DISTINCT」關鍵字以及過濾器,看看它有什麼不同。有沒有可能有多個記錄共享相同的值(flight_trip_orders.id和flight_trip_orders.order_date),但具有不同的work_info_id?那麼這些DISTINCT中哪一個會被切斷?

1

在這種情況下,優化器發生錯誤。由於您在11gR2上運行,因此您可以使用SPM強制優化器對sql使用相同的接受計劃,而不管統計數據會發生什麼變化。

啓用sql計劃管理,接受您的正確計劃並將其修復。不要忘記記錄原因,通常我們不想擁有FIXED計劃。詳情請參閱Using SQL Plan Management