將已存在資料的普通表轉變為分割槽表,沒有辦法通過修改屬性的方式直接轉化為分割槽表,必須通過重建的方式進行轉變,一般可以有三種方法,視不同場景使用:
用例:方法一:利用原表重建分割槽表。
create table t (id number primary key, time date);
insert into t
select rownum, sysdate - rownum from dba_objects where rownum <= 5000;
commit;
create table t_new (id, time) partition by range (time)
(partition p1 values less than (to_date('2000-1-1', 'yyyy-mm-dd')),
partition p2 values less than (to_date('2002-1-1', 'yyyy-mm-dd')),
partition p3 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),
partition p4 values less than (maxvalue))
as select id, time from t;
rename t to t_old;
rename t_new to t;
select count(*) from t;
count(*)
----------
5000
select count(*) from t partition (p1);
count(*)
----------
2946
select count(*) from t partition (p2);
count(*)
----------
731
select count(*) from t partition (p3);
count(*)
----------
1096
優點:方法簡單易用,由於採用ddl語句,不會產生undo,且只產生少量redo,效率相對較高,而且建表完成後資料已經在分布到各個分割槽中了。
不足:對於資料的一致性方面還需要額外的考慮。由於幾乎沒有辦法通過手工鎖定t表的方式保證一致性,在執行create table語句和rename t_new to t語句直接的修改可能會丟失,如果要保證一致性,需要在執行完語句後對資料進行檢查,而這個代價是比較大的。另外在執行兩個rename語句之間執行的對t的訪問會失敗。
適用於修改不頻繁的表,在閒時進行操作,表的資料量不宜太大。
方法二:使用交換分割槽的方法。
drop table t;
create table t (id number primary key, time date);
insert into t
select rownum, sysdate - rownum from dba_objects where rownum <= 5000;
commit;
create table t_new (id number primary key, time date) partition by range (time)
(partition p1 values less than (to_date('2005-9-1', 'yyyy-mm-dd')),
partition p2 values less than (maxvalue));
alter table t_new exchange partition p1 with table t;
rename t to t_old;
rename t_new to t;
優點:只是對資料字典中分割槽和表的定義進行了修改,沒有資料的修改或複製,效率最高。如果對資料在分割槽中的分布沒有進一步要求的話,實現比較簡單。在執行完rename操作後,可以檢查t_old中是否存在資料,如果存在的話,直接將這些資料插入到t中,可以保證對t插入的操作不會丟失。
不足:仍然存在一致性問題,交換分割槽之後rename t_new to t之前,查詢、更新和刪除會出現錯誤或訪問不到資料。如果要求資料分布到多個分割槽中,則需要進行分割槽的split操作,會增加操作的複雜度,效率也會降低。
適用於包含大資料量的表轉到分割槽表中的乙個分割槽的操作。應盡量在閒時進行操作。
drop table t;
create table t (id number primary key, time date);
insert into t
select rownum, sysdate - rownum from dba_objects where rownum <= 5000;
commit;
exec dbms_redefinition.can_redef_table(user, 't');
pl/sql 過程已成功完成。
create table t_new (id number primary key, time date) partition by range (time)
(partition p1 values less than (to_date('2004-7-1', 'yyyy-mm-dd')),
partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),
partition p3 values less than (to_date('2005-7-1', 'yyyy-mm-dd')),
partition p4 values less than (maxvalue));
表已建立。
exec dbms_redefinition.start_redef_table(user, 't', 't_new');
pl/sql 過程已成功完成。
exec dbms_redefinition.finish_redef_table(user, 't', 't_new');
pl/sql 過程已成功完成。
select count(*) from t;
count(*)
----------
5000
select count(*) from t partition (p3);
count(*)
----------
1096
優點:保證資料的一致性,在大部分時間內,表t都可以正常進行dml操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權並建立各種約束,可以做到切換完成後不再需要任何額外的管理操作。
不足:實現上比上面兩種略顯複雜。
適用於各種情況。
將普通表轉變為分割槽表
oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分割槽表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,並說明它們各自的特點。方法一 利用原表重建分割槽表。步驟 sql create table t id number primary key,time date 表已建立。sql...
將普通表轉變為分割槽表
oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分割槽表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,並說明它們各自的特點。方法一 利用原表重建分割槽表。步驟 sql create table t id number primary key,time date 表已建立。sql...
將普通表轉變為分割槽表 方法一
sql create table t id number primary key,time date table created sql insert into t select rownum,created from dba objects 52269 rows inserted sql comm...