Oracle-11g-R2
Oracle Exadata 伺服器上帶有 order by 和 rownum 的查詢的奇怪行為
我在兩個不同的數據庫伺服器上執行以下查詢:
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,並且我們在程式碼庫的很多地方都使用了此類查詢。那麼我們能克服這個問題嗎?
這個答案 是錯誤的,因為值 for
rownum
是在執行之前分配的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