深入學習分割槽表及分割槽索引(1)

junsansi發表於2008-05-05

關於分割槽表和分割槽索引(About Partitioned Tables and Indexes)

對於10gR2而言,基本上可以分成幾類:

R ange(範圍)分割槽

H ash(雜湊)分割槽

L ist(列表)分割槽

以及組合分割槽:R ange- H ash, R ange- L ist

對於表而言(常規意義上的堆組織表),上述分割槽形式都可以應用(甚至可以對某個分割槽指定compress屬性),只不過分割槽依賴列不能是lob,long之類資料型別,每個表的分割槽或子分割槽數的總數不能超過1023個。

對於索引組織表,只能夠支援普通分割槽方式,不支援組合分割槽,常規表的限制對於索引組織表同樣有效,除此之外呢,還有一些其實的限制,比如要求索引組織表的分割槽依賴列必須是主鍵才可以等。

注:本篇所有示例僅針對常規表,即堆組織表!

對於索引,需要區分建立的是全域性索引,或本地索引:

全域性索引(global index):即可以分割槽,也可以不分割槽。即可以建range分割槽,也可以建hash分割槽,即可建於分割槽表,又可建立於非分割槽表上,就是說,全域性索引是完全獨立的,因此它也需要我們更多的維護操作。

本地索引(local index):其分割槽形式與表的分割槽完全相同,依賴列相同,儲存屬性也相同。對於本地索引,其索引分割槽的維護自動進行,就是說你add/drop/split/truncate表的分割槽時,本地索引會自動維護其索引分割槽。

Oracle建議如果單個表超過2G就最好對其進行分割槽, 對於大表建立分割槽 的好處 是顯而易見的,這裡不多論述why,而將重點放在when以及how。

WHEN

一、When使用Range分割槽

Range分割槽呢是應用範圍比較廣的表分割槽方式,它是以列的值的範圍來做為分割槽的劃分條件,將記錄存放到列值所在的range分割槽中,比如按照時間劃分,2008年1季度的資料放到a分割槽,08年2季度的資料放到b分割槽,因此在建立的時候呢,需要你指定基於的列,以及分割槽的範圍值,如果某些記錄暫無法預測範圍,可以建立maxvalue分割槽,所有不在指定範圍內的記錄都會被儲存到maxvalue所在分割槽中,並且支援指定多列做為依賴列,後面在講how的時候會詳細談到。

二、When使用Hash分割槽

通常呢,對於那些無法有效劃分範圍的表,可以使用hash分割槽,這樣對於提高效能還是會有一定的幫助。hash分割槽會將表中的資料平均分配到你指定的幾個分割槽中,列所在分割槽是依據分割槽列的hash值自動分配,因此你並不能控制也不知道哪條記錄會被放到哪個分割槽中,hash分割槽也可以支援多個依賴列。

三、When使用List分割槽

List分割槽與range分割槽和hash分割槽都有類似之處,該分割槽與range分割槽類似的是也需要你指定列的值,但這又不同與range分割槽的範圍式列值---其分割槽值必須明確指定,也不同與hash分割槽---通過明確指定分割槽值,你能控制記錄儲存在哪個分割槽。它的分割槽列只能有一個,而不能像range或者hash分割槽那樣同時指定多個列做為分割槽依賴列,不過呢,它的單個分割槽對應值可以是多個。

你在分割槽時必須確定分割槽列可能存在的值,一旦插入的列值不在分割槽範圍內,則插入/更新就會失敗,因此通常建議使用list分割槽時,要建立一個default分割槽儲存那些不在指定範圍內的記錄,類似range分割槽中的maxvalue分割槽。

四、When使用組合分割槽

如果某表按照某列分割槽之後,仍然較大,或者是一些其它的需求,還可以通過分割槽內再建子分割槽的方式將分割槽再分割槽,即組合分割槽的方式。

組合分割槽呢在10g中有兩種:range-hash,range-list。注意順序喲,根分割槽只能是range分割槽,子分割槽可以是hash分割槽或list分割槽。

提示:11g在組合分割槽功能這塊有所增強,又推出了range-range,list-range,list-list,list-hash,這就相當於除hash外三種分割槽方式的笛卡爾形式都有了。為什麼會沒有hash做為根分割槽的組合分割槽形式呢,再仔細回味一下第二點,你一定能夠想明白~~。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-260278/,如需轉載,請註明出處,否則將追究法律責任。

相關文章