分割槽表和dbms_redefinition包線上重定義表
分割槽表很早就接觸的一項技術手段。分割槽表雖然在邏輯上是同一張表,可是在資料庫底層的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分割槽的數量為2的n次方,可以使得分割槽間資料更加均勻。
複合範圍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表進行dml,t10_partition也會同步t表的dml
Execute
Dbms_redefinition.finish_redef_table(‘ashuang’,’t’,’t10_partition’)
個人測試也是如此
session A在finish_redef_table時t表會被獨佔鎖,如果此時別的session B還有未提交的dml,此時會在session A 執行finish_redef_table時出現等待直到別的session B的事務提交過程才會執行完畢。
其實把分割槽表線上重定義為普通表可以的。自己可以測試下還可以對列增加 刪除 索引組織表修改等。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055754/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用DBMS_REDEFINITION線上重定義表普通表為分割槽表
- dbms_redefinition線上重定義表
- ORACLE 線上重新定義表分割槽表重定義為普通表。Oracle
- 線上重定義分割槽表和NOLOGGING APPEND分割槽表對比APP
- 利用DBMS_REDEFINITION線上重定義表
- 普通錶轉換分割槽表-線上重定義
- 使用ORACLE線上重定義將普通表改為分割槽表Oracle
- 線上重定義 ?普通錶轉換成分割槽表
- 海量資料處理_表分割槽(線上重定義)
- 使用線上重定義方法改造普通表為分割槽表實戰
- oracle分割槽表線上重定義欄位not null問題OracleNull
- ORACLE 普通錶轉換成分割槽表(線上重定義)Oracle
- 【Oracle】利用線上重定義的方式改變普通表為分割槽表Oracle
- 利用ORACLE DBMS_REDEFINITION包進行普通表到分割槽表的線上轉換Oracle
- 使用dbms_redefinition包線上把大資料量非分割槽錶轉換為分割槽表大資料
- ORACLE 普通錶轉換成分割槽表(線上重定義)(zt)Oracle
- 指令碼:線上重定義,從普通表到分割槽表,redefinition_table.sh指令碼
- dbms_redefinition利用線上重定義把普通錶轉化為分割槽表的一些測試
- 使用DBMS_REDEFINITION包執行線上重定義表(ONLINE TABLE REDEFINITION)
- 線上重定義表(Redefine Tables Online) - dbms_redefinition
- 利用線上重定義功能將普通錶轉換為分割槽表問題
- oracle 表線上重定義Oracle
- oracle表線上重定義Oracle
- 【Oracle】線上重定義表Oracle
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- 線上表格重定義研究,比如將普通錶轉換為分割槽表等
- Oracle線上重定義之DBMS_REDEFINITIONOracle
- 利用dbms_redefinition實現普通heap表和分割槽表的轉化
- oracle分割槽表和分割槽表exchangeOracle
- oracle分割槽表和非分割槽表exchangeOracle
- 線上重定義的操作步驟__普通錶轉換為分割槽表的實驗案例
- ogg環境線上重定義普通表到分割槽表實戰及生產操作注意事項-orastarAST
- Oracle表的線上重定義(一)Oracle
- oracle線上重定義表步驟Oracle
- 10g線上重定義新特性——對單獨的分割槽進行線上重定義
- MySQL 分割槽表 partition線上修改分割槽欄位MySql
- DBMS_REDEFINITION(線上重定義一個重要bug)
- Oracle中重建表的線上重定義Oracle