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