iT邦幫忙

0

Oracle table裡資料存儲順序

  • 分享至 

  • xImage

大家好

本人是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

但是看完問題後...
無言
okra iT邦研究生 3 級 ‧ 2014-11-12 15:30:29 檢舉
試一下Asia Pacific Oracle User Group (APOUG) 推的:
http://www.excel4apps.com/
s8022520 iT邦新手 5 級 ‧ 2014-11-12 15:59:19 檢舉
不好意思..功力很淺的DBA..
Tom Kyte 說過:
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.


Tom Kyte 是誰?
okra iT邦研究生 3 級 ‧ 2014-11-13 01:37:13 檢舉
Albert iT邦高手 1 級 ‧ 2014-11-17 15:42:33 檢舉
DBA 是考過 DBA 考試 =/= 有經驗
我們在大型專案裡面都有一堆對應窗口是 [考過 DBA 考試]
常會問這樣為何會比較快 ???
你程式怎麼快到好像沒執行 !!!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
10
一級屠豬士
iT邦大師 1 級 ‧ 2014-11-12 14:23:54

關聯式資料庫的理論,本來就是無序的集合.
要有順序,就一定要下ORDER BY,強制指定順序.
至於有些情況下,你下Select,剛好看到依照某種順序,
那只是剛好........不保證一定會這樣.
無序是正常,有序是碰到.
就這樣簡單.這是最基本的原理.不要去想又要依照一定的ORDER,又不想下ORDER BY.
這個不管是Oracle,SQL Server,MySQL, Posrgresql,只要他是關聯式資料庫(RDBMS),都是這樣.

看更多先前的回應...收起先前的回應...
賽門 iT邦超人 1 級 ‧ 2014-11-12 14:34:56 檢舉

讚

簡單的作法, SQL Command 做成View.
他們只要讀View

不負責的想 order by 的欄位建index

不負責的想 order by 的欄位建index

s8022520 iT邦新手 5 級 ‧ 2014-11-12 15:56:33 檢舉

已經有index了

insert的順序與實體儲存的順序是沒有關連的.
如果index還解決不了效能問題, 那就VIEW或拆TABLE(不負責@@")

s8022520 iT邦新手 5 級 ‧ 2014-11-12 16:09:30 檢舉

現在我的做法是用expdp工具,加上query=order by ID,然後再impdp導入來做測試。
但依照hito san的意思可能是無效的。不論如何,明天跟大將分享一下我的測試結果

VIEW針對效能無效...拆TABLE最快.

2
shengfu
iT邦新手 2 級 ‧ 2014-11-13 08:22:26

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雖然會影響效能,
但是絕對不是主要元凶..

okra iT邦研究生 3 級 ‧ 2014-11-13 12:28:03 檢舉

假設使用Oracle EBS bundle with Oracle BI Discovery Plus排序出來的結果可以依終端用戶需要。

0
ctn7001
iT邦新手 4 級 ‧ 2014-11-13 19:25:37

本末倒置,
我偶爾會被指派處理效能不佳的程式,
效能不好個人覺得有三類
1.硬體效能問題,錢的事錢才能解
2.table架構問題,調整table架構,這是寫程式時的規劃不夠好,或是事過境遷
3.寫程式功力問題,通常都是這種問題,Index要加對地方,且要有用到,有些效能差的怪獸程式明明table有Index,寫的程式硬是沒用到

我要發表回答

立即登入回答