在Oracle資料庫中進行排序、分組匯總、索引等到作時,會產生很多的臨時資料。如有一張員工資訊表,資料庫中是安裝記錄建立的時間來儲存的。如果使用者查詢時,使用Order BY排序語句指定按員工編號來排序,那麼排序後產生的所有記錄就是臨時資料。對於這些臨時資料,Oracle資料庫是如何處理的呢?
通常情況下,Oracle資料庫會先將這些臨時資料存放到記憶體的PGA(程式全域區)內。在這個程式全域區中有一個叫做排序區的地方,專門用來存放這些因為排序操作而產生的臨時資料。但是這個分區的容量是有限的。當這個分區的大小不足以容納排序後所產生的記錄時,資料庫系統就會將臨時資料存放到暫存資料表空間中。這就是暫存資料表空間的來曆。看起來好像這個暫存資料表空間是個臨時工,對於資料庫的影響不會有多大。其實大家這是誤解這個暫存資料表空間了。在使用者進行資料庫操作時,排序、分組匯總、索引這些作業是少不了,其會產生大量的臨時資料。為此基本上每個資料庫都需要用到暫存資料表空間。而如果這個暫存資料表空間設定不當的話,則會給資料庫效能帶來很大的負面影響。為此管理員在維護這個暫存資料表空間的時候,不能夠掉以輕心。要避免因為暫存資料表空間設定不當影響資料庫的效能。具體來說,主要需要注意如下幾個方面的內容。
一、建立使用者時要記得為使用者建立暫存資料表空間。
最好在建立使用者時為使用者指定暫存資料表空間。如可以利用語句default temporary table space語句來為資料庫設定預設的暫存資料表空間。不過在Oracle資料庫中這個不是強制的。但是筆者強烈建議這麼做。因為如果沒有為使用者指定預設暫存資料表空間的話,那麼當這個使用者因為排序等操作需要使用到暫存資料表空間的話,資料庫系統就會“自作聰明”的利用系統資料表空間SYSTEM來建立臨時段。眾所周知,這是一個系統資料表空間。由於在這個資料表空間中存放著系統運行相關的資料,一般的建議是使用者的資料不能夠儲存在這個資料表空間中。那麼如果將使用者的暫存資料表空間防止在這個系統資料表空間之內,會產生什麼負面影響呢?
由於暫存資料表空間中的資料是臨時的。為此資料庫系統需要頻繁的分配和釋放臨時段。這些頻繁的操作會在系統資料表空間中產生大量的儲存片段。當這些儲存片段比較多時,就會影響系統讀取硬碟的效率,從而影響資料庫的效能。其次系統資料表空間的大小往往是有限制的。此時臨時段也來插一腳,就會佔用系統資料表空間的大小。
為此資料庫管理員需要注意一點,當沒有為使用者指定暫存資料表空間時,使用者排序等操作仍然需要用到臨時段。此時資料庫系統就會將臨時段放入到系統資料表空間中。為此就會對資料庫的效能產生不利的影響。所以筆者建議各位讀者與資料庫管理員,在建立使用者的時候同時為使用者指定一個預設的資料表空間,以減少臨時段對系統資料表空間的佔用。
二、合理設定PGA,減少暫存資料表空間使用的幾率。
當排序操作產生臨時資料時,資料庫並不是馬上將其儲存在暫存資料表空間中。通常情況下,會先將這些臨時資料存放區在記憶體的PGA程式全域區內。只有當這個程式全域區無法容納全部資料時,資料庫系統才會啟用暫存資料表空間中的臨時段來儲存這些資料。但是眾所周知,作業系統從記憶體中讀取資料要比從硬碟中讀取資料區塊幾千倍。為此比較理想的情況是,這個程式全域區足夠的大,可以容納所有的臨時資料。此時資料庫系統就永遠用不到暫存資料表空間了。從而可以提高資料庫的效能。