分割槽表和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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 線上重定義與普通表改為分割槽表
- 線上重定義方式將普通表修改為分割槽表
- 指令碼:線上重定義,從普通表到分割槽表,redefinition_table.sh指令碼
- PG的非分割槽表線上轉分割槽表
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- oracle分割槽表和分割槽表exchangeOracle
- 線上重定義的操作步驟__普通錶轉換為分割槽表的實驗案例
- oracle分割槽表和非分割槽表exchangeOracle
- MySQL線上轉分割槽表(以及TiDB)MySqlTiDB
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 移動分割槽表和分割槽索引的表空間索引
- 在oracle 9i下線上重定義表Oracle
- PostgreSQL分割槽表、繼承表記錄去重方法SQL繼承
- Oracle 12C新特性-線上把非分割槽錶轉為分割槽表Oracle
- 壓縮錶轉非壓縮表(線上重定義)
- hive 分割槽表和分桶表區別Hive
- 【MYSQL】 分割槽表MySql
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- LightDB 22.4 新特性之相容Oracle線上轉換普通表為分割槽表Oracle
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- MySQL 分割槽表探索MySql
- 分割槽表-實戰
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- ORACLE刪除-表分割槽和資料Oracle
- MySql分表、分庫、分片和分割槽MySql
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- SQL SERVER之分割槽表SQLServer
- ORACLE分割槽表梳理系列Oracle
- Spark操作Hive分割槽表SparkHive
- OceaBase 分割槽表建立技巧
- Mysql表分割槽實現MySql
- mysql 進行表分割槽MySql
- Mysql表分割槽實操MySql
- PostgreSQL:傳統分割槽表SQL