2013-03-13 35 views
0

聲明:我知道當需要排序數據時,在SQL中不使用'ORDER BY'是不好的。Oracle排序順序 - 什麼可能導致它改變

我目前正在支持一個Pro * C程序,它有一個奇怪的問題。 奇怪問題的一個可能原因可能是原始開發人員(很久以前)在其SQL中沒有使用ORDER BY,即使程序邏輯依賴於它! 這些年來該計劃一直工作得很好,最近纔開始顯示問題。

我們試圖將錯誤問題歸咎於ORDER BY錯誤(還有其他一些原因,例如從Solaris到Linux發生的最近端口)。

我們應該看看數據庫端有什麼陰影可能改變了舊的排序順序?數據文件等東西? 任何人都有使用Solaris上Pro * C的經驗,對結果集進行神奇排序?

謝謝!

回答

2

既然您知道該程序關心的結果返回的順序,並且您知道提交的查詢缺少ORDER BY子句,是否有一個原因,您不只是解決問題而不是尋找問題試圖找出結果的實際順序是否可能發生了變化?如果你修復已知的ORDER BY問題和你已經消失的「怪異問題」,那將提供一些相當好的證據,證明「奇怪問題」實際上是由缺失的ORDER BY引起的。

不幸的是,有很多事情可能導致結果順序改變,其中許多可能無法追查。最明顯的原因是執行計劃的改變。反過來,這可能是因爲統計數據發生了變化,或者由於統計數據變化不夠或者由於修補程序或初始化參數更改或客戶端配置更改等因素造成的。如果您有權使用AWR(自動工作量資料檔案庫),則可以通過查看DBA_HIST_SQLSTAT在不同日期的SQL_ID的多個PLAN_HASH_VALUE值,找到證明計劃已更改的證據。如果存在,您仍然需要嘗試確定不同的計劃是否實際上導致結果以不同的順序返回。除了查詢計劃更改外,還有其他幾十種可能的原因。磁盤上數據的物理順序可能已經發生變化,因爲有人重新組織了該表,或者因爲某人在磁盤上移動了數據文件,或者因爲SAN通過移動數據自動重新平衡某些內容。一些數據可能已被緩存(或可能未被緩存),一般在過去被緩存。Oracle補丁可能已經被應用。

+0

感謝您的回答!我將對AWR和計劃進行更多的研究。 我已經更改了代碼,但需要一週的時間才能知道是否解決了問題。很難告訴用戶,一個星期後問題仍然沒有解決:( – dvlpr 2013-03-13 10:08:56

0

我建議改變你的物理表與視圖,並在該視圖中作出您的要求的順序。

例如

TABLE_NOT_SORTED - >重命名爲 - > PHYS_TABLE_NOT_SORTED

CREATE VIEW TABLE_NOT_SORTED 
AS 
SELECT * FROM PHYS_TABLE_NOT_SORTED 
ORDER BY DESIRED_COLUMNS 

爲了迴應評論:

根據this question和向湯姆的回答,似乎是因爲Oracle不保證默認排序,如果你不使用「ORDER BY」,他們可以自由改變它。他們當然是絕對正確的。如果您需要排序,請使用Order By。

除此之外,我們不能說你的代碼或默認順序。

+0

是的,但我遇到的問題不在於解決它。我可以將ORDER BY添加到程序中。 問題在於確定我是否正在解決正確的問題。爲此,我需要檢查導致訂單更改的數據庫端發生了什麼變化。 – dvlpr 2013-03-13 08:14:16

+0

只有你可以告訴DB @dvlpr發生了什麼,這裏的人們只能猜測。例如;你最近升級了它嗎?應用補丁?改變了一些初始化參數? – Ben 2013-03-13 08:16:28

+1

沒有用戶干預數據庫,沒有升級,沒有修補程序等。 我在尋找的是'可能'導致數據文件,分區等來自您過去的經驗。 (我說可能是因爲我認爲這沒有記錄)。 – dvlpr 2013-03-13 08:24:54

相關問題