oracle 排序原理(自己理解不一定準確)
oracle 中存在SGA和PGA ,PGA中有一個結構 sort_area
也就是說排序的時候會在PGA中執行。
那麼問題來了
臨時表空間中也會存放排序資料,也會進行排序。那麼什麼情況下使用臨時表空間?
PGA的sort_area_size的大小決定排序能否在PGA中完成?
SQL>show parameter sort_
NAME_COL_PLUS_SHOW_PARAM TYPE VALUE_COL_
-------------------------------------------------------------------------------- ----------- ----------
sort_area_retained_size integer 0
sort_area_size integer 65536
那麼在amm下,這個引數的值會不會增加呢?
最大多少,能達到pga_aggregate_target 的值麼
SQL>show parameter pga
NAME_COL_PLUS_SHOW_PARAM TYPE VALUE_COL_
-------------------------------------------------------------------------------- ----------- ----------
pga_aggregate_target big integer 200M
如果pga的sort_area夠用在pga中完成排序沒有什麼好說的,
如果pga的sort_area不夠用,那麼排序就會用到臨時表空間或永久表空間儲存臨時資料。
如果排序很大,可能直接完全在臨時表空間內完成所有排序麼?
臨時表空間屬於硬碟,pga屬於記憶體,兩者的效率差很多的。
實際上即使排序所需空間很少也可能會直接使用臨時表空間,而不在PGA中排序(參考one-pass排序)。