將普通表轉變為分割槽表

2021-04-08 15:13:40 字數 3994 閱讀 9383

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 ...