全面學(xué)習(xí)分區(qū)表及分區(qū)索引(10)--交換分區(qū)
直白的說就是遷移數(shù)據(jù)。遷移數(shù)據(jù)的方式很多,為什么要使用exchange?partition的方式呢,表急,聽三思慢慢道來。
Exchange?partition提供了一種方式,讓你在表與表或分區(qū)與分區(qū)之間遷移數(shù)據(jù),注意不是將表轉(zhuǎn)換成分區(qū)或非分區(qū)的形式,而僅只是遷移表中數(shù)據(jù)(互相遷移),由于其號稱是采用了更改數(shù)據(jù)字典的方式,因此效率最高(幾乎不涉及io操作)。Exchange?partition適用于所有分區(qū)格式,你可以將數(shù)據(jù)從分區(qū)表遷移到非分區(qū)表,也可以從非分區(qū)表遷移至分區(qū)表,或者從hash?partition到range?partition諸如此類吧。
其語法很簡單:alter?table?tbname1?exchange?partition/subpartition?ptname?with?table?tbname2;
Exchange?partition遷移的方式也很有意思,言語表達(dá)怕大家聽不明白,下面直接通過示例來表達(dá):
借用前文中創(chuàng)建的空分區(qū)表: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???);
表已創(chuàng)建。
JSSWEB>?insert?into?t_partition_range?values?(11,'a');
已創(chuàng)建?1?行。
JSSWEB>?insert?into?t_partition_range?values?(12,'b');
已創(chuàng)建?1?行。
JSSWEB>?insert?into?t_partition_range?values?(13,'c');
已創(chuàng)建?1?行。
JSSWEB>?commit;
提交完成。
再創(chuàng)建一個(gè)非分區(qū)表,結(jié)構(gòu)與t_partition_range相同
JSSWEB>?create?table?t_partition_range_tmp?(id?number,name?varchar2(50));
表已創(chuàng)建。
執(zhí)行交換分區(qū)(我們知道剛插入到range分區(qū)表的數(shù)據(jù)都在分區(qū)t_range_p2中,因此這里指定交換該分區(qū))
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
記錄成功交換到未分區(qū)的表中。
我們再執(zhí)行一次exchange?partition的命令,看看又會發(fā)生什么呢
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;
未選定行
又交換回來了,有點(diǎn)兒意思。
再做個(gè)更加明確的測試,我們往未分區(qū)的表中加入一些記錄后再執(zhí)行exchange?partition,看看會發(fā)生什么呢:
JSSWEB>?insert?into?t_partition_range_tmp?values?(15,'d');
已創(chuàng)建?1?行。
JSSWEB>?insert?into?t_partition_range_tmp?values?(16,'e');
已創(chuàng)建?1?行。
JSSWEB>?insert?into?t_partition_range_tmp?values?(1
7
,'d');
已創(chuàng)建?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?
涉及交換的兩表之間表結(jié)構(gòu)必須一致,除非附加with?validation子句;
l?
如果是從非分區(qū)表向分區(qū)表做交換,非分區(qū)表中的數(shù)據(jù)必須符合分區(qū)表中指定分區(qū)的規(guī)則,除非附加without?validation子句;
l?
如果從分區(qū)表向分區(qū)表做交換,被交換的分區(qū)的數(shù)據(jù)必須符合分區(qū)規(guī)則,除非附加without?validation子句;
l?
Global索引或涉及到數(shù)據(jù)改動了的global索引分區(qū)會被置為unusable,除非附加update?indexes子句。
提示:
一旦附加了without?validation子句,則表示不再驗(yàn)證數(shù)據(jù)有效性,因此指定該子句時(shí)務(wù)必慎重。
例如:
JSSWEB>?insert?into?t_partition_range_tmp?values?(8,'g');
已創(chuàng)建?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分區(qū)的范圍值,但指定了without?validation后,數(shù)據(jù)仍然轉(zhuǎn)換成功。
posted on 2009-05-07 22:09 tobyxiong 閱讀(338) 評論(0) 編輯 收藏 所屬分類: DATABASES