普通錶轉分區表三種方法

 1.創建分區表示例

 
  1. create table pt3( id number)
  2. partition by range(id) 
  3. ( partition p1 values less than (5000),
  4. partition p2 values less than (maxvalue)
  5. ); 
 
 
Oracle的普通表沒有辦法通過修改屬性的方式直接轉化爲分區表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,並說明它們各自的特點。
 
2.普錶轉分區方法一:利用原表重建分區表
 
 
  1. SQL> create table test ( id number primary key,time date); 
  2.   
  3. Table created. 
  4.   
  5. SQL> INSERT INTO TEST SELECT ROWNUM, CREATED FROM USER_OBJECTS; 
  6.   
  7. SQL>commit
  8.   
  9. SQL> create table pt4(id,time
  10. partition by range(time
  11. (partition p1 values less than (to_date('2006-1-1','yyyy-mm-dd')),
  12. partition p2 values less than (maxvalue)
  13. as select id,time from test; 
 
---注意,此處建分區表時,不需指定列的數據類型,因爲用了create ...as select...列的數據類型跟後面select的表的數據類型是一致的。
 
  1.   
  2. SQL> rename test to test_old; 
  3.   
  4. Table renamed. 
  5.   
  6. SQL> rename pt4 to test; 
  7.   
  8. SQL> select count(*) from test partition (p1); 
  9.   
  10.   COUNT(*) 
  11. ---------- 
  12.          0 
  13.   
  14. SQL>  select count(*) from test partition (p2); 
 
 
優點:方法簡單易用,由於採用DDL語句,不會產生UNDO,且只產生少量REDO,效率相對較高,而且建表完成後數據已經在分佈到各個分區中了。
不足:對於數據的一致性方面還需要額外的考慮。由於幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執行CREATE TABLE語句和RENAME TEST TO TEST_OLD語句直接的修改可能會丟失,如果要保證一致性,需要在執行完語句後對數據進行檢查,而這個代價是比較大的。另外在執行兩個RENAME語句之間執行的對 TEST的訪問會失敗。
適用於修改不頻繁的表,在閒時進行操作,表的數據量不宜太大。 
 
 
3.普錶轉分區方法二:使用交換分區的方法
 
 
  1. SQL> create table t ( id number primary key,time date); 
  2.   
  3. Table created. 
  4.   
  5. SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM USER_OBJECTS; 
  6.   
  7. SQL>commit
  8.   
  9. SQL> create table pt4(id number,time date) partition by range(time) (partition p1 values less than (to_date('2006-1-1','yyyy-mm-dd')),partition p2 values less than (maxvalue)); 
  10.   
  11. SQL>alter table pt4 exchange partition with table t without validation; 
  12.   
  13. SQL> rename t to t_old; 
  14.   
  15. Table renamed. 
  16.   
  17. SQL> rename pt4 to t; 
  18.   
  19. SQL> select count(*) from t ; 
  20.   
  21. SQL> select count(*) from t partition (p1); 
  22.   
  23.   COUNT(*) 
  24. ---------- 
  25.          0 
  26.   
  27. SQL>  select count(*) from test partition (p2); 
 
 
優點:只是對數據字典中分區和表的定義進行了修改,沒有數據的修改或複製,效率最高。如果對數據在分區中的分佈沒有進一步要求的話,實現比較簡單。在執行完RENAME操作後,可以檢查T_OLD中是否存在數據,如果存在的話,直接將這些數據插入到T中,可以保證對T插入的操作不會丟失。
不足:仍然存在一致性問題,交換分區之後RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據。如果要求數據分佈到多個分區中,則需要進行分區的SPLIT操作,會增加操作的複雜度,效率也會降低。
適用於包含大數據量的錶轉到分區表中的一個分區的操作。應儘量在閒時進行操作。 
 
 
4.普錶轉分區方法三:Oracle9i以上版本,利用在線重定義功能 
 
 
  1. SQL> create table t ( id number primary key,time date); 
  2.   
  3. Table created. 
  4.   
  5. SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM USER_OBJECTS; 
  6.   
  7. SQL>commit
  8.   
  9. SQL> create table pt5(id number,time date)  
  10. partition by range(time)  
  11. ( partition p1 values less than (to_date('2011-7-1','yyyy-mm-dd')), 
  12.   partition p2 values less than (maxvalue) 
  13. ); 
  14.   
  15.   
  16. SQL>conn / as sysdba 
  17.   
  18. SQL> exec dbms_redefinition.can_redef_table('HR','TEST_OLD'); 
  19.   
  20. SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('HR','TEST_OLD','PT5','ID ID,TIME TIME'); 
  21.   
  22. SQL> INSERT INTO TEST_OLD VALUES(55,SYSDATE); 
  23.   
  24. SQL>commit
  25.   
  26. SQL> SELECT * FROM TEST_OLD; 
  27.   
  28. SQL> SELECT COUNT(*) FROM PT5; 
  29.   
  30.   COUNT(*) 
  31. ---------- 
  32.         44 
  33.   
  34. SQL> SELECT COUNT(*) FROM PT5; 
  35.   
  36.   COUNT(*) 
  37. ---------- 
  38.         45 
  39.   
  40. SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('HR','TEST_OLD','PT5'); 
  41.   
  42.   
  43. SQL> SELECT COUNT(*) FROM PT5; 
  44.   
  45.   COUNT(*) 
  46. ---------- 
  47.         45 
  48.   
  49. SQL> SELECT COUNT(*) FROM PT5; 
  50.   
  51.   COUNT(*) 
  52. ---------- 
  53.         45 
 
 
 
優點:保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權並建立各種約束,可以做到切換完成後不再需要任何額外的管理操作。
不足:實現上比上面兩種略顯複雜。 
 
 
 
還有就是:將原表rename,重建表,然後用insert /*+ append*/將數據導入。
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章