Oracle數(shù)據(jù)庫中段管理的四個技巧
在Oracle數(shù)據(jù)庫中,段往往被用來存儲特定邏輯對象的所有數(shù)據(jù)。如當建立數(shù)據(jù)庫表或者索引時,Oracle就會為這些對象分配存儲空間,以存放他們所需要的信息。段是由一個或者多個區(qū)組成的。不要看段是Oracle數(shù)據(jù)庫中一個不起眼的角色,其實,在其中,仍然隱藏著許多不為人知的管理技巧。若數(shù)據(jù)庫管理員能夠掌握這些內(nèi)容,或許,其工作會變得輕松許多。
技巧一:對大表執(zhí)行分區(qū)段
表分區(qū)段用于存儲分區(qū)表中某個分區(qū)的數(shù)據(jù)。如把某一個表分為幾個區(qū),每個區(qū)就對應(yīng)一個表分區(qū)段。這么設(shè)置是可行的。因為根據(jù)段管理規(guī)則,在一個表空間上可以包含一個或者多個段,但是,一個段只能夠存放在一個表空間上。
在實際工作中,我們經(jīng)常會碰到這種情況。如在一個大型零售企業(yè)的信息化管理系統(tǒng)中,一張銷售表的年數(shù)據(jù)總量可能會達到幾億條,其數(shù)據(jù)總?cè)萘靠赡軙薪畟€G。如果平均分配到每個季度的話,則就有2.5G。此時,如果不對這張銷售表進行分區(qū)分段管理的話,則這一年的銷售記錄都會存儲在一張表中。此時,如果需要做年度分析的話,那么數(shù)據(jù)庫的性能將會受到很大的影響。如現(xiàn)在用戶想知道六、七月份空調(diào)的銷量變化情況,此時數(shù)據(jù)庫就需要掃描整個數(shù)據(jù)表中近10G的紀錄。這需要用戶等待比較長的時間。
但是,此時若數(shù)據(jù)庫管理員在數(shù)據(jù)庫設(shè)計的時候,就能夠預(yù)計到這種情況,對銷售表進行分區(qū)分段管理。即把這張銷售表分區(qū)段管理,也就是說,把銷售表分為四個分區(qū)段,每個季度一個區(qū)段。如此的話,若要統(tǒng)計六、七月份的空調(diào)銷售情況,則只需要查詢5G的數(shù)據(jù)即可,其數(shù)據(jù)查詢量將近減少了一半。顯然,在實際工作中,如果對大表進行分區(qū)段管理,則可以大大降低I/O次數(shù),并有效提高數(shù)據(jù)庫查詢性能。若銷售量大的話,甚至可以把銷售表分為十二個區(qū)段,一個月對應(yīng)一個區(qū)段。
所以,通過使用分區(qū)選項,采用表區(qū)段管理大表,可以將一張大表的數(shù)據(jù)部署到多個不同的分區(qū)段中。通過這種管理方式,可以降低I/O(輸入輸出)讀取次數(shù),最終提高I/O性能。這是數(shù)據(jù)庫優(yōu)化專家在提高數(shù)據(jù)庫性能時,經(jīng)常用到的一種手段。特別是在零售行業(yè)的信息化管理系統(tǒng)中,經(jīng)常被用到。
技巧二:合理利用索引組織表段
在Oracle數(shù)據(jù)庫中,跟索引相關(guān)的表段主要有三個,分別為索引段、索引分區(qū)段與索引組織表段。
索引段主要用來存儲索引數(shù)據(jù)。當數(shù)據(jù)庫管理員建立索引時,數(shù)據(jù)庫系統(tǒng)就會自動為索引建立相應(yīng)的索引段,其名字跟索引的名稱相同。在對索引段進行管理時,有一個基本的原則,即一個索引段只能夠存放在一個表空間中。
索引分區(qū)段主要用來存儲分區(qū)索引某個分區(qū)的數(shù)據(jù)。他跟筆者上面所說的表分區(qū)段類似。每個分區(qū)對應(yīng)一個索引分區(qū)段。通過使用分區(qū)選項可以將大索引的數(shù)據(jù)部署到幾個不同的分區(qū)段中,從而達到降低輸入輸出次數(shù)、提高數(shù)據(jù)庫性能的目的。不過其在管理中,比表分區(qū)段多了一個限制條件,即索引分區(qū)只能夠建立在分區(qū)表上,而不能夠建立在普通表上。其他的管理跟分區(qū)表段類似,就不再重復(fù)闡述了。
索引組織表是以B數(shù)結(jié)構(gòu)來組織表數(shù)據(jù)的,其對應(yīng)的段就是索引組織表段。其管理方式跟索引段類似。當數(shù)據(jù)庫管理員建立索引時,就會自動創(chuàng)建這個段,用來保存相關(guān)的數(shù)據(jù)。
現(xiàn)在擺在數(shù)據(jù)庫管理員面前,就有一個難題。在什么時候用索引段,什么時候用索引組織表段,又在什么時候采用索引分區(qū)段呢?為此,筆者給出一個建議,供大家參考。
通常情況下,如果表中的數(shù)據(jù)經(jīng)常需要引用主鍵列萊檢索的話,則可以考慮建立索引組織表,即通過索引組織段來管理。因為如果建立索引組織表段,則表和表主鍵索引的數(shù)據(jù)會存放在索引段中。從而提高查詢的速度。而在普通表中,表與索引數(shù)據(jù)分別存放在表段與索引段中。這就是兩者最本質(zhì)的區(qū)別。另外需要提醒的是,如果數(shù)據(jù)庫管理員建立索引組織表時,數(shù)據(jù)庫開發(fā)人員必須要定義主鍵列。否則的話,就會以失敗告終。
而如果索引比較大的話,則可以將大索引的數(shù)據(jù)部署道幾個不同的分去段中,這可以有效提高數(shù)據(jù)庫的性能。#p#
技巧三:減少臨時段的使用
臨時段主要用來存儲排序等操作所產(chǎn)生的臨時數(shù)據(jù)。如現(xiàn)在某張數(shù)據(jù)表中,有A、C、B、F、E、D等記錄。此時,若用Order By子句對其進行排序,數(shù)據(jù)庫系統(tǒng)就會返回A、B、C、D、E、F數(shù)據(jù)。這些被重新排序過的數(shù)據(jù),就叫做臨時數(shù)據(jù)。通常情況下,這些臨時數(shù)據(jù)會存放在兩個地方,分別為PGA工作區(qū)與臨時段中。默認情況下,這些臨時數(shù)據(jù)會先存儲在PAG工作區(qū)。如果因為臨時數(shù)據(jù)比較大,PGA工作區(qū)已經(jīng)滿了的情況下,數(shù)據(jù)庫會把剩下的臨時數(shù)據(jù)存放到臨時段中。
從理論上講,無論是把數(shù)據(jù)存放在PGA工作區(qū)還是存儲在臨時段中,對于用戶的最終結(jié)果沒有影響。但是,如果從數(shù)據(jù)庫性能方面考慮,則兩者就有比較大的差異。
PGA工作區(qū),又叫做程序全局區(qū)域,它是包含服務(wù)器進程的數(shù)據(jù)和控制信息的非共享內(nèi)存區(qū)域。通常情況下,只要數(shù)據(jù)庫服務(wù)器進程啟動,則Oracle就會在內(nèi)存中創(chuàng)建程序全局區(qū)域。在10G以后的版本中,Oracle數(shù)據(jù)庫能夠自動根據(jù)內(nèi)存的使用情況來管理程序全局區(qū)域,而不用數(shù)據(jù)庫管理員去手工的干預(yù),從而使得PGA工作區(qū)的使用率更高。所以,一般來說,把臨時數(shù)據(jù)存放在PGA工作區(qū),其效率更高。
在實際工作中,數(shù)據(jù)庫管理員應(yīng)該盡量避免產(chǎn)生大量的臨時數(shù)據(jù),或者說,盡量不讓臨時數(shù)據(jù)超過PGA工作區(qū)所能夠承受的***容量。從而數(shù)據(jù)庫不得不把臨時數(shù)據(jù)存放到臨時段中。
在實際工作中,很多Select語句都會產(chǎn)生臨時數(shù)據(jù)。如在Select語句中,若加入Order By、Group By等子句,都會導(dǎo)致數(shù)據(jù)庫對數(shù)據(jù)文件中的記錄進行重新組織,從而產(chǎn)生大量的臨時數(shù)據(jù)。為此,在應(yīng)用程序設(shè)計中,就***能夠加入一些默認的查詢限制條件,從而避免產(chǎn)生大量的臨時數(shù)據(jù)。如在銷售表查詢的時候,如果用戶沒有輸入具體的查詢條件,則應(yīng)用程序默認只查詢近30天的銷售記錄,并按交易的日期或者產(chǎn)品進行排序。如果這些記錄不能夠滿足用戶的需求,再進行全部記錄的查詢。如此設(shè)計的話,就可以在一定程度上減少臨時數(shù)據(jù),減少臨時段使用的頻率。因為根據(jù)相關(guān)統(tǒng)計,用戶在查詢的時候,往往不會主動加入查詢條件。而他們所需要的數(shù)據(jù),往往都是最近一些的交易記錄。為此,在應(yīng)用程序設(shè)計過程中,加入一些默認的查詢條件是非常有必要的。
技巧四:LOB段***獨立與普通表
在Oracle數(shù)據(jù)庫中,除了可以存放一些字符、數(shù)字等基本數(shù)據(jù)類型外,還可以存儲附件、圖像、音頻、視頻文件等等。用來存放這些數(shù)據(jù)的段,就叫做LOB段。當數(shù)據(jù)庫在創(chuàng)建這些特殊類型的列時,Oracle數(shù)據(jù)庫系統(tǒng)就會自動為他們建立對應(yīng)的LOB段。通常情況下,如果這些特殊數(shù)據(jù)類型的長度比4000字節(jié)要少,則這一列與其他普通列的數(shù)據(jù)會一起存放在表段中,如果數(shù)據(jù)長度超過了4000字節(jié),則數(shù)據(jù)庫就會被存放在LOB段中。
如果從數(shù)據(jù)庫性能方面考慮,***能夠把這些特殊的數(shù)據(jù)類型跟其他數(shù)據(jù)類型分別存放。如現(xiàn)在有一張產(chǎn)品信息表,需要包含產(chǎn)品ID、產(chǎn)品名稱、產(chǎn)品規(guī)格、產(chǎn)品圖像等內(nèi)容。那么,在數(shù)據(jù)庫設(shè)計的時候,***能夠建立兩張表,一張用來存儲產(chǎn)品ID、產(chǎn)品名稱、產(chǎn)品規(guī)格等信息;另一張表中存儲產(chǎn)品ID、產(chǎn)品圖像等信息。如此設(shè)計,主要是出于兩個方面的考慮。
一是在實際工作中,并不是每次查看產(chǎn)品信息時,都需要產(chǎn)品圖像的內(nèi)容。如在生成訂單時,沒有必要再每次下單時都顯示產(chǎn)品圖片。因為對于一些老產(chǎn)品來說,這個產(chǎn)品圖像早就印在用戶腦海中。即使系統(tǒng)顯示圖片信息,用戶也不會去關(guān)注。
二是這會影響數(shù)據(jù)庫的查詢性能。眾所周知,數(shù)據(jù)庫查詢效率跟數(shù)據(jù)容量有很大的關(guān)系。數(shù)據(jù)容量越大,其查詢的效率越低。而LOB段中存儲的數(shù)據(jù)往往都是一些大容量的數(shù)據(jù)。所以在用戶不需要的情況下,顯示圖像等信息,就會大大降低數(shù)據(jù)庫的性能。再說,在一些應(yīng)用程序中,由于網(wǎng)速或者刷新率等原因,其顯示圖像信息本身就要比顯示文字信息來的慢。這就更加延長了用戶的等待時間。
所以,LOB段的數(shù)據(jù)類型***能夠跟表中的其他字段分開來管理。在數(shù)據(jù)庫設(shè)計的時候,就可以把他們存放在獨立的表中,然后通過關(guān)鍵字進行關(guān)聯(lián)。
【編輯推薦】