全面學習分區表及分區索引(10)--交換分區
直白的說就是遷移數據。遷移數據的方式很多,為什么要使用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?(1
7
,'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
這就是前面所說的,互相交換的意思~~
注意:
l?
涉及交換的兩表之間表結構必須一致,除非附加with?validation子句;
l?
如果是從非分區表向分區表做交換,非分區表中的數據必須符合分區表中指定分區的規則,除非附加without?validation子句;
l?
如果從分區表向分區表做交換,被交換的分區的數據必須符合分區規則,除非附加without?validation子句;
l?
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后,數據仍然轉換成功。
posted on 2009-05-07 22:09 tobyxiong 閱讀(331) 評論(0) 編輯 收藏 所屬分類: DATABASES