不要讓臨時(shí)表空間影響Oracle數(shù)據(jù)庫(kù)性能
在Oracle數(shù)據(jù)庫(kù)中進(jìn)行排序、分組匯總、索引等到作時(shí),會(huì)產(chǎn)生很多的臨時(shí)數(shù)據(jù)。如有一張員工信息表,數(shù)據(jù)庫(kù)中是安裝記錄建立的時(shí)間來(lái)保存的。如果用戶(hù)查詢(xún)時(shí),使用Order BY排序語(yǔ)句指定按員工編號(hào)來(lái)排序,那么排序后產(chǎn)生的所有記錄就是臨時(shí)數(shù)據(jù)。對(duì)于這些臨時(shí)數(shù)據(jù),Oracle數(shù)據(jù)庫(kù)是如何處理的呢?
通常情況下,Oracle數(shù)據(jù)庫(kù)會(huì)先將這些臨時(shí)數(shù)據(jù)存放到內(nèi)存的PGA(程序全局區(qū))內(nèi)。在這個(gè)程序全局區(qū)中有一個(gè)叫做排序區(qū)的地方,專(zhuān)門(mén)用來(lái)存放這些因?yàn)榕判虿僮鞫a(chǎn)生的臨時(shí)數(shù)據(jù)。但是這個(gè)分區(qū)的容量是有限的。當(dāng)這個(gè)分區(qū)的大小不足以容納排序后所產(chǎn)生的記錄時(shí),數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)將臨時(shí)數(shù)據(jù)存放到臨時(shí)表空間中。這就是臨時(shí)表空間的來(lái)歷??雌饋?lái)好像這個(gè)臨時(shí)表空間是個(gè)臨時(shí)工,對(duì)于數(shù)據(jù)庫(kù)的影響不會(huì)有多大。其實(shí)大家這是誤解這個(gè)臨時(shí)表空間了。在用戶(hù)進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),排序、分組匯總、索引這些作業(yè)是少不了,其會(huì)產(chǎn)生大量的臨時(shí)數(shù)據(jù)。為此基本上每個(gè)數(shù)據(jù)庫(kù)都需要用到臨時(shí)表空間。而如果這個(gè)臨時(shí)表空間設(shè)置不當(dāng)?shù)脑?huà),則會(huì)給數(shù)據(jù)庫(kù)性能帶來(lái)很大的負(fù)面影響。為此管理員在維護(hù)這個(gè)臨時(shí)表空間的時(shí)候,不能夠掉以輕心。要避免因?yàn)榕R時(shí)表空間設(shè)置不當(dāng)影響數(shù)據(jù)庫(kù)的性能。具體來(lái)說(shuō),主要需要注意如下幾個(gè)方面的內(nèi)容。
一、創(chuàng)建用戶(hù)時(shí)要記得為用戶(hù)創(chuàng)建臨時(shí)表空間。
最好在創(chuàng)建用戶(hù)時(shí)為用戶(hù)指定臨時(shí)表空間。如可以利用語(yǔ)句default temporary table space語(yǔ)句來(lái)為數(shù)據(jù)庫(kù)設(shè)置默認(rèn)的臨時(shí)表空間。不過(guò)在Oracle數(shù)據(jù)庫(kù)中這個(gè)不是強(qiáng)制的。但是筆者強(qiáng)烈建議這么做。因?yàn)槿绻麤](méi)有為用戶(hù)指定默認(rèn)臨時(shí)表空間的話(huà),那么當(dāng)這個(gè)用戶(hù)因?yàn)榕判虻炔僮餍枰褂玫脚R時(shí)表空間的話(huà),數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)“自作聰明”的利用系統(tǒng)表空間SYSTEM來(lái)創(chuàng)建臨時(shí)段。眾所周知,這是一個(gè)系統(tǒng)表空間。由于在這個(gè)表空間中存放著系統(tǒng)運(yùn)行相關(guān)的數(shù)據(jù),一般的建議是用戶(hù)的數(shù)據(jù)不能夠保存在這個(gè)表空間中。那么如果將用戶(hù)的臨時(shí)表空間防止在這個(gè)系統(tǒng)表空間之內(nèi),會(huì)產(chǎn)生什么負(fù)面影響呢?
由于臨時(shí)表空間中的數(shù)據(jù)是臨時(shí)的。為此數(shù)據(jù)庫(kù)系統(tǒng)需要頻繁的分配和釋放臨時(shí)段。這些頻繁的操作會(huì)在系統(tǒng)表空間中產(chǎn)生大量的存儲(chǔ)碎片。當(dāng)這些存儲(chǔ)碎片比較多時(shí),就會(huì)影響系統(tǒng)讀取硬盤(pán)的效率,從而影響數(shù)據(jù)庫(kù)的性能。其次系統(tǒng)表空間的大小往往是有限制的。此時(shí)臨時(shí)段也來(lái)插一腳,就會(huì)占用系統(tǒng)表空間的大小。
為此數(shù)據(jù)庫(kù)管理員需要注意一點(diǎn),當(dāng)沒(méi)有為用戶(hù)指定臨時(shí)表空間時(shí),用戶(hù)排序等操作仍然需要用到臨時(shí)段。此時(shí)數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)將臨時(shí)段放入到系統(tǒng)表空間中。為此就會(huì)對(duì)數(shù)據(jù)庫(kù)的性能產(chǎn)生不利的影響。所以筆者建議各位讀者與數(shù)據(jù)庫(kù)管理員,在創(chuàng)建用戶(hù)的時(shí)候同時(shí)為用戶(hù)指定一個(gè)默認(rèn)的表空間,以減少臨時(shí)段對(duì)系統(tǒng)表空間的占用。
二、合理設(shè)置PGA,減少臨時(shí)表空間使用的幾率。
當(dāng)排序操作產(chǎn)生臨時(shí)數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)并不是馬上將其存儲(chǔ)在臨時(shí)表空間中。通常情況下,會(huì)先將這些臨時(shí)數(shù)據(jù)存儲(chǔ)在內(nèi)存的PGA程序全局區(qū)內(nèi)。只有當(dāng)這個(gè)程序全局區(qū)無(wú)法容納全部數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)才會(huì)啟用臨時(shí)表空間中的臨時(shí)段來(lái)保存這些數(shù)據(jù)。但是眾所周知,操作系統(tǒng)從內(nèi)存中讀取數(shù)據(jù)要比從硬盤(pán)中讀取數(shù)據(jù)塊幾千倍。為此比較理想的情況是,這個(gè)程序全局區(qū)足夠的大,可以容納所有的臨時(shí)數(shù)據(jù)。此時(shí)數(shù)據(jù)庫(kù)系統(tǒng)就永遠(yuǎn)用不到臨時(shí)表空間了。從而可以提高數(shù)據(jù)庫(kù)的性能。
但是這畢竟只是一個(gè)理想。由于內(nèi)存大小等多方面的限制,這個(gè)PGA程序區(qū)的大小往往是有限制的。所以在進(jìn)行一些大型的排序操作時(shí),這個(gè)臨時(shí)表空間仍然少不了?,F(xiàn)在數(shù)據(jù)庫(kù)管理員可以做的就是合理設(shè)置這個(gè)PGA程序全局區(qū)的大小,盡量減少臨時(shí)表空間使用的幾率。如在實(shí)際工作中,數(shù)據(jù)庫(kù)管理員可以根據(jù)需要來(lái)設(shè)置初始化參數(shù)SORT_AREA_SIZE參數(shù)。這個(gè)參數(shù)主要控制這個(gè)PGA程序全局區(qū)內(nèi)排序區(qū)的大小。通常情況下,如果這個(gè)數(shù)據(jù)庫(kù)系統(tǒng)主要用來(lái)查詢(xún)并且需要大量的排序、分組匯總、索引等操作時(shí),那么可以適當(dāng)調(diào)整這個(gè)參數(shù),來(lái)擴(kuò)大PGA分區(qū)的大小。相反,如果這個(gè)系統(tǒng)主要用于更新操作,或者在這個(gè)數(shù)據(jù)庫(kù)服務(wù)器上還部署由其他的應(yīng)用程序,那么這個(gè)PGA分區(qū)就不能夠占用太多的內(nèi)存,以防止對(duì)其他應(yīng)用程序產(chǎn)生不利的影響。所以說(shuō),數(shù)據(jù)庫(kù)官員不能夠一刀切,需要根據(jù)實(shí)際情況來(lái)調(diào)整。在必要的情況下,可以增加系統(tǒng)內(nèi)存來(lái)增加PGA分區(qū)的大小,從而降低臨時(shí)表空間的使用幾率,以提高數(shù)據(jù)庫(kù)的排序、分組匯總等操作的性能。
總之,如果臨時(shí)段被頻繁使用的話(huà),由于內(nèi)存與硬盤(pán)在性能上的差異,從而會(huì)降低數(shù)據(jù)庫(kù)的性能。為此在平時(shí)工作中,數(shù)據(jù)庫(kù)管理員還需要監(jiān)控臨時(shí)表空間的使用情況,以判斷是否需要采取措施來(lái)減少臨時(shí)表空間的使用來(lái)提高數(shù)據(jù)庫(kù)的查詢(xún)性能。為了實(shí)現(xiàn)這個(gè)目的,筆者建議數(shù)據(jù)庫(kù)管理員可以查看v$sort_segment這張動(dòng)態(tài)性能視圖。通過(guò)這張動(dòng)態(tài)性能視圖可以查看系統(tǒng)排序段(臨時(shí)段的一種)的使用情況。另外通過(guò)動(dòng)態(tài)性能視圖v$sort_usage還可以查詢(xún)使用排序段的用戶(hù)與會(huì)話(huà)信息。從而為數(shù)據(jù)庫(kù)管理員優(yōu)化數(shù)據(jù)庫(kù)性能提供數(shù)據(jù)上的支持。對(duì)于這個(gè)排序段,筆者還要說(shuō)明一點(diǎn)。對(duì)于排序段來(lái)說(shuō),同一個(gè)例程的所有SQL語(yǔ)句(如果需要排序操作的話(huà))都將共享同一個(gè)排序段。并且排序段在第一次需要用到時(shí)被創(chuàng)建。排序完成后這個(gè)排序段不會(huì)被釋放,只有在這個(gè)歷程關(guān)閉后排序段才會(huì)被釋放。為此以上兩張視圖要綜合起來(lái)分析,才能夠得到數(shù)據(jù)庫(kù)管理員想要的信息。
三、要為臨時(shí)表空間保留足夠的硬盤(pán)空間。
其他表空間對(duì)應(yīng)的數(shù)據(jù)文件,在其創(chuàng)建時(shí)就會(huì)被完全分配和初始化,即在其創(chuàng)建時(shí)就會(huì)被分配存儲(chǔ)空間。但是臨時(shí)表空間對(duì)應(yīng)的臨時(shí)文件則不同。如在Linux操作系統(tǒng)中,臨時(shí)表空間創(chuàng)建時(shí)系統(tǒng)是不會(huì)分配和初始化臨時(shí)文件的。也就是說(shuō),不會(huì)為臨時(shí)文件分配存儲(chǔ)空間。只有臨時(shí)數(shù)據(jù)出現(xiàn)需要用到臨時(shí)文件的時(shí)候,系統(tǒng)才會(huì)在硬盤(pán)上分配一塊地方用來(lái)保存臨時(shí)文件。此時(shí)就可能會(huì)產(chǎn)生一個(gè)問(wèn)題,即當(dāng)需要用到臨時(shí)文件系統(tǒng)為其分配空間的時(shí)候,才會(huì)先系統(tǒng)分區(qū)中沒(méi)有足夠的存儲(chǔ)空間了。此時(shí)就會(huì)產(chǎn)生一些難以預(yù)料的后果。
為此對(duì)于這些臨時(shí)文件,數(shù)據(jù)庫(kù)管理員最好能夠預(yù)先為其保留足夠的空間。如在Linux操作系統(tǒng)中,可以將其防止在一個(gè)獨(dú)立的分區(qū)內(nèi),不允許其他應(yīng)用程序使用。如此的話(huà),就不用擔(dān)心臨時(shí)文件沒(méi)有地方存儲(chǔ)了。另外由于臨時(shí)表空間主要用來(lái)存放一些排序用的臨時(shí)文件。為此如果能夠?qū)⑦@個(gè)臨時(shí)表空間存放在性能比較好的分區(qū)中,還可以提高數(shù)據(jù)庫(kù)系統(tǒng)讀取臨時(shí)表空間中數(shù)據(jù)的速度。另外由于系統(tǒng)需要頻繁分配臨時(shí)表空間中的數(shù)據(jù),為此臨時(shí)表空間所在的分區(qū)會(huì)出現(xiàn)比較多的碎片。此時(shí)如果將臨時(shí)表空間存放在一個(gè)獨(dú)立的分區(qū)內(nèi),那么數(shù)據(jù)庫(kù)管理員就可以單獨(dú)對(duì)這個(gè)分區(qū)進(jìn)行碎片整理,從而提高這個(gè)分區(qū)的性能。所以無(wú)論出于什么原因,將臨時(shí)表空間防止在一個(gè)獨(dú)立的分區(qū)內(nèi),是一個(gè)不錯(cuò)的想法。不僅可以保證臨時(shí)文件有存儲(chǔ)的空間,而且還可以提高數(shù)據(jù)庫(kù)的性能。
對(duì)于臨時(shí)表空間最后需要說(shuō)明的是,默認(rèn)情況下這個(gè)臨時(shí)表空間對(duì)各個(gè)用戶(hù)都是共享的。也就是說(shuō)每個(gè)連接到數(shù)據(jù)庫(kù)的用戶(hù)都可以使用默認(rèn)的臨時(shí)表空間。數(shù)據(jù)庫(kù)管理員可以為其指定其他的臨時(shí)表空間。一般來(lái)說(shuō),只需要一個(gè)臨時(shí)表空間即可。
【編輯推薦】