分割槽表和dbms_redefinition包線上重定義表

dotaddjj發表於2011-10-17

分割槽表很早就接觸的一項技術手段。分割槽表雖然在邏輯上是同一張表,可是在資料庫底層的segment確實多個物件,管理和維護可以只對分割槽表進行維護,採取將分割槽表儲存在不同的表空間,表空間儲存在不同的磁碟,改善了對錶段的I/O

雖然自己所接觸的生產庫中並不存在分割槽表,但是一般超過了2Gb的表段就最好使用分割槽表,而且一些需要定期刪除歷史資料的表也可以採取分割槽表技術。

range範圍分割槽

create table t10_partition(id number,edate date)

partition by range(edate)

(

partition p1 values less than(to_date('2011-10-1','yyyy-mm-dd')) tablespace users,

partition p2 values less than(('2011-10-1','yyyy-mm-dd')) tablespace test

)

range分割槽中的maxvalue也包括null,當insert into t10_partition values(null,null),資料還是會存在p2分割槽中。

list分割槽:

create table t12_partition(id number,edate date)

partition by list(id)

(

partition p1 values(1) tablespace users,

partition p2 values(2) tablespace test

)

按列表的值來分割槽

hash分割槽:

create table t13_partition(id number,edate date)

partition by hash(id)

(

partition p1 tablespace users,

partition p2 tablespace users

)

hash分割槽採取的對列值進行hash演算法,確定放入哪個分割槽。當列的值沒有合適的選擇條件時,採取hash分割槽,hash分割槽均勻分佈資料。一般hash分割槽的數量為2n次方,可以使得分割槽間資料更加均勻。

複合範圍hash分割槽:

create table t14_partition(id number,edate date)

partition by range(id) subpartition by hash(edate)

(

partition p1 values less than(20) tablespace users,

partition p2 values less than(50) tablespace users

)

幾個有關分割槽的命令:

新增分割槽

alter table t10_partition add partition p3 values less than(maxvalue)

add partition需要高於最後一個分割槽

刪除分割槽

alter table t10_partition drop partition p3

截斷分割槽

Alter table t10_partition truncate partition p3

合併分割槽

Alter table t10_partition merge partitions p1,p2 into partition p2

合併分割槽需要將分割槽合併到較高的分割槽

Alter table t10_partition rename partition p2 to p1

其實說到分割槽表,oracle 9I後推出了線上重定義表的功能來對錶段進行線上重定義,其中利用系統包可以把普通表修改為分割槽表,而且在修改過程中也可以進行正常的dml

Create table t(id number,name varchar2(20))

Insert into t as select rownum,table_name from user_tables

Commit

此時t表中有部分資料資訊,如果考慮到後續的t表資料量資訊較大和I/O需要把t表進行分割槽可以利用oracle的基本語法:

Create table t01

Partition by hash(name)

(

Partition p1 tablespace users,

Partition p2 tablespace test

)

利用oracle的基本語法:

Insert table t01 select * from t

Alter table t rename tt

Alter table t01 rename to t

不過此時可能insert過程中還會有資料資訊,所以對於7*24生產環境而且資料交換又比較大,此時就極有可能漏掉資料資訊

還需要我們再一次檢查。

利用dbms_redefinition包來線上重定義表

Execute dbms_redefinition.can_redef_table(‘ashuang’,’t’)

需要對t表定義主鍵,也可以使用rowid來線上重定義,不過一般不推薦

因為會產生一個虛列,不然無法對錶進行線上重定義

Execute dbms_redefinition.start_redef_table(‘ashuang’,’t’,’t10_partition’)

Execute dbms_redefinition.sync_interim_table(‘ashuang’,’t’,’t10_partition’)

此時如果對t表進行dmlt10_partition也會同步t表的dml

Execute

Dbms_redefinition.finish_redef_table(‘ashuang’,’t’,’t10_partition’)

個人測試也是如此

session Afinish_redef_tablet表會被獨佔鎖,如果此時別的session B還有未提交的dml,此時會在session A 執行finish_redef_table時出現等待直到別的session B的事務提交過程才會執行完畢。

其實把分割槽表線上重定義為普通表可以的。自己可以測試下還可以對列增加 刪除 索引組織表修改等。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055754/,如需轉載,請註明出處,否則將追究法律責任。

相關文章