全面學習分割槽表及分割槽索引(13)--分隔表分割槽

junsansi發表於2008-05-27

1、分隔分割槽(Split Partition)

如果你對我們前面講到過的merge partition還有印象的話,那麼學習Split partition也不會遇到什麼障礙,split partition的功能與merge partition功能正好相反:後者是將兩個全區合併成一個,前者則是將一個分割槽分隔成兩個。其用途非常廣泛,比如通常見你發現某個分割槽過大,你就可以通過這種方式將該分割槽分解成多個小分割槽,對我而言最常用到的,當然還是split maxvalue/default的分割槽。

該命令的語法針對不同分割槽會有不同的形式,

For range partition:alter table tbname split partition ptname at (value) into (partition newpt1 tbs_clause,partition newpt2 tbs_clause);

For list partition : alter table tbname split partition ptname values (v1,v2...vn) into (partition newpt1 tbs_clause,partition newpt2 tbs_clause);

上述兩項,如果是操作子分割槽,則將partition關鍵字換成subpartition即可。舊分割槽中符合新定義值的記錄會儲存到指定的第一個分割槽中,其它的記錄儲存到第二個分割槽。

例如,range分割槽的示例:

JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions

  2  where table_name='T_PARTITION_RANGE';

PARTITION_NAME       HIGH_VALUE                               TABLESPACE_NAME

-------------------- ---------------------------------------- --------------------

T_RANGE_P3           30                                       TBSPART03

T_RANGE_PMAX         MAXVALUE                                 TBSPART04

T_RANGE_P1           20                                       TBSPART02

我們將t_range_p1分割槽分隔到兩個分割槽中,小於10的存放新建分割槽t_range_p1(已非原t_range_p1鳥,只是名稱相同而已),其它資料存入t_range_p2分割槽:

JSSWEB> alter table t_partition_range split partition t_range_p1 at (10) into

  2  (partition t_range_p1 tablespace tbspart01,

  3  partition t_range_p2 tablespace tbspart02);

表已更改。

JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions

  2  where table_name='T_PARTITION_RANGE';

PARTITION_NAME       HIGH_VALUE                               TABLESPACE_NAME

-------------------- ---------------------------------------- --------------------

T_RANGE_P3           30                                       TBSPART03

T_RANGE_PMAX         MAXVALUE                                 TBSPART04

T_RANGE_P1           10                                       TBSPART01

T_RANGE_P2           20                                       TBSPART02

再來演示一個list分割槽的例子:

JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions

  2  where table_name='T_PARTITION_LIST';

PARTITION_NAME       HIGH_VALUE                               TABLESPACE_NAME

-------------------- ---------------------------------------- --------------------

T_LIST_P1            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 33        TBSPART01

T_LIST_P2            21, 22, 23, 24, 25, 26, 27, 28, 29, 30,  TBSPART02

                     11, 12, 13, 14, 15, 16, 17, 18, 19, 20

T_LIST_PD            default                                  TBSPART04

我們將t_list_p2分割槽中分割槽值是2打頭的儲存到t_list_p3分割槽中,其它值儲存到t_list_p2分割槽:

JSSWEB> alter table t_partition_list split partition t_list_p2 values

  2  (20,21,22,23,24,25,26,27,28,29) into

  3  (partition t_list_p3 tablespace tbspart03,

  4  partition t_list_p2);

表已更改。

JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions

  2  where table_name='T_PARTITION_LIST';

PARTITION_NAME       HIGH_VALUE                               TABLESPACE_NAME

-------------------- ---------------------------------------- --------------------

T_LIST_P1            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 33        TBSPART01

T_LIST_P2            30, 11, 12, 13, 14, 15, 16, 17, 18, 19   TBSPART02

T_LIST_PD            default                                  TBSPART04

T_LIST_P3            20, 21, 22, 23, 24, 25, 26, 27, 28, 29   TBSPART03

提示:

split partition/subpartition不能用於hash分割槽或hash子分割槽(hash的話,直接用add partition就好了)

split partition/subpartition視被分隔的分割槽資料量多少,可能需要花費不小的代價,相當於該分割槽資料的全掃描,我們也許可以形容為:full partition scan:),除非:

Split後的兩個分割槽中,至少有一個是空的,並且非空的那個分割槽的儲存屬性與split前的儲存屬性完全相同

如果split的分割槽包含lob欄位,split後非空的那個分割槽中該欄位的儲存屬性也必須與split前的儲存屬性完全相同。

這種情況下的split partition/subpartition也會非常高效,oracle會自動進行優化,此時的分割槽操作類似於add partition。

通常情況下,如果在執行split partition/subpartition時,如果沒有指定update indexes子句,都會造成local和global索引的失效。注意,我們說的是通常,如果你split partition/subpartition的是個空分割槽,或者沒有觸發任何資料移動或變化,那麼即使不加update indexes,也不會影響到索引。當然,保險起見,建議你還是執行完之後,查詢一下資料字典,確認一下當前索引的狀態。

=====================================

檢視前面的連載:

(12)--修改list表分割槽

(11)--合併表分割槽

(10)--交換表分割槽

(9)--刪除表分割槽

(8)--增加和收縮表分割槽

(7)--怎樣管理

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

相關文章