我的java天地

          全面學習分區表及分區索引(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后,數據仍然轉換成功。

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

          查看前面的連載:

          (9)--刪除表分區

          (8)--增加和收縮表分區

          (7)--怎樣管理

          (6)--創建range-list組合分區

          (5)--創建range-hash組合分區(1)

          (4)--創建list分區

          (3)--創建hash分區

          (2)--創建range分區

          (1)--前言

          posted on 2009-05-07 22:09 tobyxiong 閱讀(331) 評論(0)  編輯  收藏 所屬分類: DATABASES

          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類(144)

          隨筆檔案(157)

          相冊

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 项城市| 沁阳市| 崇礼县| 沙湾县| 普洱| 达拉特旗| 阳春市| 卢氏县| 张家界市| 汉川市| 肇源县| 舒城县| 临漳县| 乡城县| 太原市| 宣汉县| 隆化县| 宁南县| 镶黄旗| 井研县| 太原市| 漠河县| 祁阳县| 永靖县| 穆棱市| 九江县| 武定县| 吉隆县| 乌苏市| 阿合奇县| 宿迁市| 常山县| 临湘市| 恩平市| 通海县| 江门市| 安义县| 满城县| 旺苍县| 来安县| 前郭尔|