新聞中心
在Oracle數(shù)據(jù)庫中進(jìn)行排序、分組匯總、索引等到作時(shí),會產(chǎn)生很多的臨時(shí)數(shù)據(jù)。如有一張員工信息表,數(shù)據(jù)庫中是安裝記錄建立的時(shí)間來保存的。如果用戶查詢時(shí),使用Order BY排序語句指定按員工編號來排序,那么排序后產(chǎn)生的所有記錄就是臨時(shí)數(shù)據(jù)。對于這些臨時(shí)數(shù)據(jù),Oracle數(shù)據(jù)庫是如何處理的呢?

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


咨詢
建站咨詢
