簡單陳述一下
針對每個session
排序首先會使用sort_area_size
如果不足則會使用臨時表空間
但這裡面又到底是怎麼一個過程呢?下面闡述一下
也許對大家有用處(如果有什麼不清楚或者不恰當的地方歡迎大家探討)
假設sort_area_size =
k
正好能盛下
條記錄進行排序
當排序記錄小於等於
條
ok
所有排序在內存中進行
很快
但若超過
條
則會使用臨時表空間(利用磁盤進行)
我們選取一個臨界值來說明
假設需要排序的記錄有
條
這個時候我們進行的排序會分為
組進行
每讀
條進行一次小組排序
然後寫入磁盤
第
組只有
條
排序後也寫入磁盤
這是進行第二次排序
這次排序將在前
小組裡面各抽取一條進行排序
《按照我個人的猜測
應該是排好後每寫入一條入磁盤則將該記錄所在小組重新抽取一條出來進行排序(這時是有序記錄組裡面所以很快)》
當這個過程完成後
這時所需要的磁盤空間大約為 實際記錄存儲空間的
倍(這也是多數書上提到的排序空間大約是記錄空間的
倍的原因)
由於還剩下
條記錄
於是這
條記錄需要跟前面排序的
條記錄進行排序合並
這個代價也是相當大的!
所以
我們通常推薦
假如你需要排序的記錄最大為
萬條
則sort_area_size最小要能裝下
條
否則如上面的例子
那多余的
條
僅僅
條將會帶來巨大的代價!
如果
設置的極度不合理的情況下
排序記錄達到了 sort_area_size所能容納的三次方以上
比如上面例子中排序需要
萬記錄
那麼同樣的
重復這個過程
當每一萬條記錄如上排序後
再如上從這
小組(每組
條記錄)各抽一條進行排序……
在這個過程中
磁盤的消耗和時間的代價大家都應該有個感性認識了
所以
我們建議
sprt_area_size 所能容納記錄數至少大於排序記錄數的 平方根
oracle文檔
From:http://tw.wingwit.com/Article/program/Oracle/201311/18815.html