大家好
本人是Oracle DBA,最近遇到一個問題,不知各路大神可不可以給予一點方向
使用的產品是Oracle 11gR2,Application的頁面要select一張表,但是select出來在頁面上的順序是亂的,他們希望顯示出來是order by ID,又不想在程式碼裡加order by影響性能,所以希望把這張表重建,讓資料在table裡面儲存的方式就是order by ID。但是我用sqlplus在後台看那張表,直接select * from <table>,顯示出來的ID都是以順序排列的,不知道是不是oracle有甚麼樣的機制,讓select * from <table>出來的結果跟實際資料存儲的順序有所不同?
下面這張圖是application裡面select這張表,可以看到SKU(=ID)列沒有順序
預期的select結果應該是這樣
麻煩各位了,謝謝
s8022520提到:
本人是Oracle DBA
RULES OF THE GAME: rule #1: if you want, expect, or need sorted data, there is exactly one way to achieve that in a relational database. you must use ORDER BY rule #2: please re-read #1 until you believe it.
關聯式資料庫的理論,本來就是無序的集合.
要有順序,就一定要下ORDER BY,強制指定順序.
至於有些情況下,你下Select,剛好看到依照某種順序,
那只是剛好........不保證一定會這樣.
無序是正常,有序是碰到.
就這樣簡單.這是最基本的原理.不要去想又要依照一定的ORDER,又不想下ORDER BY.
這個不管是Oracle,SQL Server,MySQL, Posrgresql,只要他是關聯式資料庫(RDBMS),都是這樣.
Oracle 資料在寫入的時候會產生rowid ,你可以使用這樣的語法看到rowid的欄位資訊
select a.rowid form table a
應該是以rowid做排序,而不是用who column (create_date/create_by...等欄位)
所以正常來說,你的排序結果應該是資料建立的先後順序,因此若你的資料是有序時序號,那麼直接select 出來的結果應該都滿漂亮的.
如果真的要排的準確但打死不可用order by ,那麼你可以試試看將table drop掉在重建一次資料,或是乾脆下
create table b as
select *
from table a
order by x欄位
這樣b table產生出來的資料應該就是有排序後的,且不用再order by
不過就以查詢畫面來說,通常會有參數(條件),很少會全部show出來,因此
就算你下order by ,在限定條件的情況下,應該也不會影響到多少效能
PS:其實我覺得最大的問題,還是sql 主體...order by雖然會影響效能,
但是絕對不是主要元凶..
本末倒置,
我偶爾會被指派處理效能不佳的程式,
效能不好個人覺得有三類
1.硬體效能問題,錢的事錢才能解
2.table架構問題,調整table架構,這是寫程式時的規劃不夠好,或是事過境遷
3.寫程式功力問題,通常都是這種問題,Index要加對地方,且要有用到,有些效能差的怪獸程式明明table有Index,寫的程式硬是沒用到