使用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 ,直接修改了某些頭部資訊,完成了所謂的資料互換工作