Oracle-11g-R2

Oracle Exadata 伺服器上帶有 order by 和 rownum 的查詢的奇怪行為

  • August 28, 2015

我在兩個不同的數據庫伺服器上執行以下查詢:

SELECT start_date,
 end_date,
 resort_id
FROM employee_activity
WHERE employee_id = 27
 AND start_date < to_date('2012-11-09', 'YYYY-MM-DD')
 AND is_overridden = 1
 AND ROWNUM = 1 
ORDER BY start_date DESC;

此查詢在 Exadata 上返回與在其他伺服器上不同的記錄。在 Exadata 上,它首先選擇第一行,然後進行排序。在另一台伺服器上,它首先進行排序,然後返回第一行。

我們在兩台伺服器上都使用 Oracle 11g。

現在我們面臨的問題是,我們已將數據庫伺服器升級到 Exadata,並且我們在程式碼庫的很多地方都使用了此類查詢。那麼我們能克服這個問題嗎?

這個答案 是錯誤的,因為值 forrownum是在執行之前分配的order by

下面是正確的,

SELECT start_date,  
      end_date,  
      resort_id,  
      ROWNUM  
FROM   (SELECT   start_date,  
               end_date,  
               resort_id  
      FROM     employee_activity  
      WHERE    employee_id = 27  
      AND      start_date < TO_DATE ('2012-11-09', 'YYYY-MM-DD')  
      AND      is_overridden = 1  
      ORDER BY start_date DESC
     )  
WHERE  ROWNUM = 1

引用自:https://dba.stackexchange.com/questions/35221