1. 程式人生 > >使用exchange 和split partition 來將一個Oracle非分割槽錶轉換為分割槽表

使用exchange 和split partition 來將一個Oracle非分割槽錶轉換為分割槽表

 線上重定義表可以將一個非分割槽錶轉換成一個分割槽表。使用exchange 和split partition 也可以將一個非分割槽錶轉換為分割槽表。後者相比較前者,因為不受要轉換的資料量影響,因此也更方便、快捷一些。
     exchange partition 操作能將一個分割槽表的一個分割槽和另一張表的資料互換,這裡的互換是segment 頭部資訊的修改,資料block 並不做改動,因此,和資料量無關,速度會非常快;完成後,再可以按照需要將分割槽具體split 成其他多個分割槽。
總的有三個步驟:
1.建立一個空的,只有一個分割槽的同構分割槽表
2.exchange partition with table 來互換資料
3.split 分割槽表的分割槽為合適的個數
 舉例如下:
-- 建立空的分割槽表
create  table  test_part 
    partition by range ( created )
    ( partition all_data values less than (MAXVALUE))
    as select owner,object_name,object_type,created  from test2 where  1=2;   

-- 執行exchange partition 操作
SQL> alter  table test_part exchange  partition all_data with table test2 ;
Table altered
SQL> select *  from  test_part where rownum<4;                --分割槽表中有資料了,原表沒有了資料
OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE        CREATED
------------------------------ -------------------------------------------------------------------------------- ------------------ -----------
SYS                            I_CDEF1                                                                          INDEX              2000-5-12 1
SYS                            IND$                                                                             TABLE              2000-5-12 1
SYS                            FILE$                                                                            TABLE              2000-5-12 1
SQL> select *  from  test2 where rownum<4;
OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE        CREATED
------------------------------ -------------------------------------------------------------------------------- ------------------ -----------
SQL>
-- split range 分割槽
SQL> alter table  test_part  split  partition all_data AT (to_date('20070101','YYYYMMDD'))  into ( partition before_2007 , partition after_2007  ) ;
Table altered
SQL>
SQL> select table_name,partition_name,high_value,composite,subpartition_count  from  user_tab_partitions;
TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE                                                                       COMPOSITE SUBPARTITION_COUNT
------------------------------ ------------------------------ -------------------------------------------------------------------------------- --------- ------------------
TEST_PART                      AFTER_2007                     MAXVALUE                                                                         NO                         0
TEST_PART                      BEFORE_2007                    TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA NO                         0

SQL>
--對 exchange partition with table 操作做了10046 trace,分析trace 可以看出,這個ddl 操作實際上遞迴出了若干個dml,正是這些dml ,直接修改了某些頭部資訊,完成了所謂的資料互換工作