全面學習分割槽表及分割槽索引(10)--交換分割槽

壹頁書發表於2014-01-22

直白的說就是遷移資料。遷移資料的方式很多,為什麼要使用exchange partition的方式呢,表急,聽三思慢慢道來。

Exchange partition提供了一種方式,讓你在表與表或分割槽與分割槽之間遷移資料,注意不是將錶轉換成分割槽或非分割槽的形式,而僅只是遷移表中資料(互相遷移),由於其號稱是採用了更改資料字典的方式,因此效率最高(幾乎不涉及io操作)。Exchange partition適用於所有分割槽格式,你可以將資料從分割槽表遷移到非分割槽表,也可以從非分割槽表遷移至分割槽表,或者從hash partition到range partition諸如此類吧。

其語法很簡單:alter table tbname1 exchange partition/subpartition ptname with table tbname2;

Exchange partition遷移的方式也很有意思,言語表達怕大家聽不明白,下面直接透過示例來表達:

借用前文中建立的空分割槽表:t_partition_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   );

表已建立。

JSSWEB> insert into t_partition_range values (11,'a');

已建立 1 行。

JSSWEB> insert into t_partition_range values (12,'b');

已建立 1 行。

JSSWEB> insert into t_partition_range values (13,'c');

已建立 1 行。

JSSWEB> commit;

提交完成。

再建立一個非分割槽表,結構與t_partition_range相同

JSSWEB> create table t_partition_range_tmp (id number,name varchar2(50));

表已建立。

執行交換分割槽(我們知道剛插入到range分割槽表的資料都在分割槽t_range_p2中,因此這裡指定交換該分割槽)

JSSWEB> alter table t_partition_range exchange partition t_range_p2

  2  with table t_partition_range_tmp;

表已更改。

看看效果如何:

JSSWEB> select * from t_partition_range partition(t_range_p2);

未選定行

JSSWEB> select * from t_partition_range_tmp;

        ID NAME

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

        11 a

        12 b

        13 c

記錄成功交換到未分割槽的表中。

我們再執行一次exchange partition的命令,看看又會發生什麼呢

JSSWEB> select *from t_partition_range partition(t_range_p2);

        ID NAME

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

        11 a

        12 b

        13 c

JSSWEB> select *from t_partition_range_tmp;

未選定行

又交換回來了,有點兒意思。

再做個更加明確的測試,我們往未分割槽的表中加入一些記錄後再執行exchange partition,看看會發生什麼呢:

JSSWEB> insert into t_partition_range_tmp values (15,'d');

已建立 1 行。

JSSWEB> insert into t_partition_range_tmp values (16,'e');

已建立 1 行。

JSSWEB> insert into t_partition_range_tmp values (17,'d');

已建立 1 行。

JSSWEB> alter table t_partition_range exchange partition t_range_p2

  2  with table t_partition_range_tmp;

表已更改。

JSSWEB> select *from t_partition_range partition(t_range_p2);

        ID NAME

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

        15 d

        16 e

        17 d

JSSWEB> select *from t_partition_range_tmp;

        ID NAME

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

        11 a

        12 b

        13 c

這就是前面所說的,互相交換的意思~~

注意:

涉及交換的兩表之間表結構必須一致,除非附加with validation子句;

如果是從非分割槽表向分割槽表做交換,非分割槽表中的資料必須符合分割槽表中指定分割槽的規則,除非附加without validation子句;

如果從分割槽表向分割槽表做交換,被交換的分割槽的資料必須符合分割槽規則,除非附加without validation子句;

Global索引或涉及到資料改動了的global索引分割槽會被置為unusable,除非附加update indexes子句。

提示:

一旦附加了without validation子句,則表示不再驗證資料有效性,因此指定該子句時務必慎重。

例如:

JSSWEB> insert into t_partition_range_tmp values (8,'g');

已建立 1 行。

JSSWEB> alter table t_partition_range exchange partition t_range_p2

  2  with table t_partition_range_tmp without validation;

表已更改。

JSSWEB> select *from t_partition_range partition(t_range_p2);

        ID NAME

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

        11 a

        12 b

        13 c

         8 g

雖然新插入的記錄並不符合t_range_p2分割槽的範圍值,但指定了without validation後,資料仍然轉換成功。

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

檢視前面的連載:

(9)--刪除表分割槽

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

(7)--怎樣管理

(6)--建立range-list組合分割槽

(5)--建立range-hash組合分割槽(1)

(4)--建立list分割槽

(3)--建立hash分割槽

(2)--建立range分割槽

(1)--前言

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

相關文章