關於分割槽表和分割槽索引(About Partitioned Tables and Indexes)
- Range(範圍)分割槽
- Hash(雜湊)分割槽
- List(列表)分割槽
- 以及組合分割槽:Range-Hash,Range-List。
對於表而言(常規意義上的堆組織表),上述分割槽形式都可以應用(甚至可以對某個分割槽指定compress屬性),只不過分割槽依賴列不能是lob,long之類資料型別,每個表的分割槽或子分割槽數的總數不能超過1023個。
對於索引組織表,只能夠支援普通分割槽方式,不支援組合分割槽,常規表的限制對於索引組織表同樣有效,除此之外呢,還有一些其實的限制,比如要求索引組織表的分割槽依賴列必須是主鍵才可以等。
注:本篇所有示例僅針對常規表,即堆組織表!
對於索引,需要區分建立的是全域性索引,或本地索引:
l 全域性索引(global index):即可以分割槽,也可以不分割槽。即可以建range分割槽,也可以建hash分割槽,即可建於分割槽表,又可建立於非分割槽表上,就是說,全域性索引是完全獨立的,因此它也需要我們更多的維護操作。
l 本地索引(local index):其分割槽形式與表的分割槽完全相同,依賴列相同,儲存屬性也相同。對於本地索引,其索引分割槽的維護自動進行,就是說你add/drop/split/truncate表的分割槽時,本地索引會自動維護其索引分割槽。
Oracle建議如果單個表超過2G就最好對其進行分割槽,對於大表建立分割槽的好處是顯而易見的,這裡不多論述why,而將重點放在when以及how。
[@more@]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做為根分割槽的組合分割槽形式呢,再仔細回味一下第二點,你一定能夠想明白~~。
HOW
一、如何建立
如果想對某個表做分割槽,必須在建立表時就指定分割槽,我們可以對一個包含分割槽的表中的分割槽做修改,但不能直接將一個未分割槽的表修改成分割槽表(起碼在10g是不行的,當然你可能會說,可以透過線上重定義的方式,但是這不是直接喲,這也是藉助臨時表間接實現的)。
建立表或索引的語法就不說了,大家肯定比我還熟悉,而想在建表(索引)同時指定分割槽也非常容易,只需要把建立分割槽的子句放到";"前就行啦,同時需要注意表的row movement屬性,它用來控制是否允許修改列值所造成的記錄移動至其它分割槽儲存,有enable|disable兩種狀態,預設是disable row movement,當disable時,如果記錄要被更新至其它分割槽,則更新語句會報錯。
下面分別演示不同分割槽方式的表和索引的建立:
1、建立range分割槽
需要我們指定的有:
l column:分割槽依賴列(如果是多個,以逗號分隔);
l partition:分割槽名稱;
l values less than:後跟分割槽範圍值(如果依賴列有多個,範圍對應值也應是多個,中間以逗號分隔);
l tablespace_clause:分割槽的儲存屬性,例如所在表空間等屬性(可為空),預設繼承基表所在表空間的屬性。
① 建立一個標準的range分割槽表:
JSSWEB> create table t_partition_range (id number,name varchar2(50))
2 partition by range(id)(
3 partition t_range_p1 values less than (10) tablespace tbspart01,
4 partition t_range_p2 values less than (20) tablespace tbspart02,
5 partition t_range_p3 values less than (30) tablespace tbspart03,
6 partition t_range_pmax values less than (maxvalue) tablespace tbspart04
7 );
表已建立。
要查詢建立分割槽的資訊,可以透過查詢user_part_tables,user_tab_partitions兩個資料字典(索引分割槽、組織分割槽等資訊也有對應的資料字典,後續示例會逐步提及)。
user_part_tables:記錄分割槽的表的資訊;
user_tab_partitions:記錄表的分割槽的資訊。
例如:
JSSWEB> select table_name,partitioning_type,partition_count
2 From user_part_tables where table_name='T_PARTITION_RANGE';
TABLE_NAME PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
T_PARTITION_RANGE RANGE 4
JSSWEB> select partition_name,high_value,tablespace_name
2 from user_tab_partitions where table_name='T_PARTITION_RANGE'
3 order by partition_position;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ ---------- --------------------
T_RANGE_P1 10 TBSPART01
T_RANGE_P2 20 TBSPART02
T_RANGE_P3 30 TBSPART03
T_RANGE_PMAX MAXVALUE TBSPART04
② 建立global索引range分割槽:
JSSWEB> create index idx_parti_range_id on t_partition_range(id)
2 global partition by range(id)(
3 partition i_range_p1 values less than (10) tablespace tbspart01,
4 partition i_range_p2 values less than (40) tablespace tbspart02,
5 partition i_range_pmax values less than (maxvalue) tablespace tbspart03);
索引已建立。
由上例可以看出,建立global索引的分割槽與建立表的分割槽語句格式完全相同,而且其分割槽形式與索引所在表的分割槽形式沒有關聯關係。
注意:我們這裡藉助上面的表t_partition_range來演示建立range分割槽的global索引,並不表示range分割槽的表,只能建立range分割槽的global索引,只要你想,也可以為其建立hash分割槽的global索引。
查詢索引的分割槽資訊可以透過user_part_indexes、user_ind_partitions兩個資料字典:
JSSWEB> select index_name, partitioning_type, partition_count
2 From user_part_indexes
3 where index_name = 'IDX_PARTI_RANGE_ID';
INDEX_NAME PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
IDX_PARTI_RANGE_ID RANGE 3
JSSWEB> select partition_name, high_value, tablespace_name
2 from user_ind_partitions
3 where index_name = 'IDX_PARTI_RANGE_ID'
4 order by partition_position;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ ---------- --------------------
I_RANGE_P1 10 TBSPART01
I_RANGE_P2 40 TBSPART02
I_RANGE_PMAX MAXVALUE TBSPART03
③ Local分割槽索引的建立最簡單,例如:
仍然藉助t_partition_range表來建立索引
--首先刪除之前建立的global索引
JSSWEB> drop index IDX_PARTI_RANGE_ID;
索引已刪除。
JSSWEB> create index IDX_PARTI_RANGE_ID on T_PARTITION_RANGE(id) local;
索引已建立。
查詢相關資料字典:
JSSWEB> select index_name, partitioning_type, partition_count
2 From user_part_indexes
3 where index_name = 'IDX_PARTI_RANGE_ID';
INDEX_NAME PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
IDX_PARTI_RANGE_ID RANGE 4
JSSWEB> select partition_name, high_value, tablespace_name
2 from user_ind_partitions
3 where index_name = 'IDX_PARTI_RANGE_ID'
4 order by partition_position;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
------------------------------ ---------- --------------------
T_RANGE_P1 10 TBSPART01
T_RANGE_P2 20 TBSPART02
T_RANGE_P3 30 TBSPART03
T_RANGE_PMAX MAXVALUE TBSPART04
可以看出,local索引的分割槽完全繼承表的分割槽的屬性,包括分割槽型別,分割槽的範圍值即不需指定也不能更改,這就是前面說的:local索引的分割槽維護完全依賴於其索引所在表。
不過呢分割槽名稱,以及分割槽所在表空間等資訊是可以自定義的,例如:
SQL> create index IDX_PART_RANGE_ID ON T_PARTITION_RANGE(id) local (
2 partition i_range_p1 tablespace tbspart01,
3 partition i_range_p2 tablespace tbspart01,
4 partition i_range_p3 tablespace tbspart02,
5 partition i_range_pmax tablespace tbspart02
6 );
索引已建立。
SQL> select index_name, partitioning_type, partition_count
2 From user_part_indexes
3 where index_name = 'IDX_PART_RANGE_ID';
INDEX_NAME PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
IDX_PART_RANGE_ID RANGE 4
SQL> select partition_name, high_value, tablespace_name
2 from user_ind_partitions
3 where index_name = 'IDX_PART_RANGE_ID'
4 order by partition_position;
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
--------------- --------------- --------------------
I_RANGE_P1 10 TBSPART01
I_RANGE_P2 20 TBSPART01
I_RANGE_P3 30 TBSPART02
I_RANGE_PMAX MAXVALUE TBSPART02
==================================
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/786540/viewspace-1004399/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【學習筆記】分割槽表和分割槽索引——管理索引分割槽(四)筆記索引
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- Oracle分割槽表及分割槽索引Oracle索引
- 全面學習分割槽表及分割槽索引(16)--增加和刪除索引分割槽索引
- 分割槽表、分割槽索引和全域性索引部分總結索引
- 全面學習分割槽表及分割槽索引(8)--增加和收縮表分割槽索引
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 分割槽表及分割槽索引建立示例索引
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- 全面學習分割槽表及分割槽索引(15)--修改表分割槽屬性和模板索引
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- 全面學習分割槽表及分割槽索引(17)--其它索引分割槽管理操作索引
- 分割槽表分割槽索引查詢效率探究索引
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- oracle分割槽表和分割槽表exchangeOracle
- 深入學習Oracle分割槽表及分割槽索引Oracle索引
- 全面學習分割槽表及分割槽索引(1)索引
- 全面認識oracle分割槽表及分割槽索引Oracle索引
- 深入學習分割槽表及分割槽索引(1)索引
- 全域性分割槽索引和區域性分割槽索引索引
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- 【學習筆記】分割槽表和分割槽索引——概念部分(一)筆記索引
- oracle分割槽表和非分割槽表exchangeOracle
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- 關於 Oracle 分割槽索引的失效和重建Oracle索引
- 關於分割槽表的操作
- 全面學習分割槽表及分割槽索引(6)--建立range-list組合分割槽索引
- 關於 Oracle 分割槽索引的建立和維護Oracle索引
- SQL Server 表分割槽(partitioned table/Data Partitioning)SQLServer
- 關於ORACLE MYSQL在非字首分割槽索引上分割槽剪裁的比較OracleMySql索引
- 深入學習分割槽表及分割槽索引(5)--建立range-hash組合分割槽(續)索引
- Oracle分割槽表全域性索引新增分割槽時不會失效Oracle索引
- 全面學習分割槽表及分割槽索引(7)--怎樣管理索引