DM巧用分区交换将非分区表转换为分区表
在實際業務中,隨著時間推移,表的數據量越來越大,影響了業務的讀寫性能;而如果表在設計之初使用的是普通表,沒有使用分區表,此時隨著系統的減慢,則考慮將大表轉化為分區表。
非區分表轉換為分區表的方法有多種,可以使用邏輯導出導入的方式轉化,也可以借用insert into ... select的方式,本章介紹使用分區交換將非分區表轉換為分區表。
01
構建測試表和測試數據
新建TEST用戶,并賦予TEST用戶創建表的權限;
使用TEST用戶創建非分區表T_NOPARTITIONTAB,表結構參考如下:
create table t_nopartitiontab ( id int, name varchar(20))?tablespace?main;在T_NOPARTITIONTAB表中插入1000行測試數據:???????
begin for i in 1..1000 loop insert into t_nopartitiontab(id, name) values(i, DBMS_RANDOM.RANDOM_STRING('U',5)||':'|| lpad(i,4, '0')); end loop;end;02
創建分區表
創建分區表t_partitiontab,表字段結構與t_nopartitiontab相同,使用id字段范圍分區。???????
create table t_partitiontab ( id int, name varchar(20)) partition by range(id) ( partition p1 values less than (200), partition p2 values less than (400), partition p3 values less than (600), partition p4 values less than (800), partition pN values less than (maxvalue)03
使用exchange交換分區
將非分區表t_nopartitiontab的數據交換到t_partitiontab表的pN分區。
alter table t_partitiontab exchange partition pN with table t_nopartitiontab;分區交換后,t_nopartitiontab中數據為空,t_partitiontab中有1000行數據。
使用如下語句查詢t_partitiontab分區表的數據分布:???????
select 'p1' partition_name, count(*) num from t_partitiontab partition(p1) union allselect 'p2', count(*) from t_partitiontab partition(p2) union allselect 'p3', count(*) from t_partitiontab partition(p3) union allselect 'p4', count(*) from t_partitiontab partition(p4) union allselect 'pN', count(*) from t_partitiontab partition(pN);可以看出普通非分區表的數據交換到分區表的某個分區后,數據并不進行校驗,也就是說不管是否滿足該分區的范圍,數據都會進入該分區。
04
使用split將分區拆分
上述數據交換后,所有數據都在一個分區,完全不符合我們將數據放入分區表的初衷,此時可以使用分區拆分,分區拆分會對分區中的數據進行重組,拆分后數據會重新按照分區范圍分布。執行以下命令進行分區拆分(僅范圍分區支持分區拆分):
alter table t_partitiontab split partition pN at (1000) into (partition p5, partition pmax);分區拆分后,使用如下語句查詢t_partitiontab分區表的數據分布:???????
select 'p1' partition_name, count(*) num from t_partitiontab partition(p1) union allselect 'p2', count(*) from t_partitiontab partition(p2) union allselect 'p3', count(*) from t_partitiontab partition(p3) union allselect 'p4', count(*) from t_partitiontab partition(p4) union allselect 'p5', count(*) from t_partitiontab partition(p5) union allselect 'pmax', count(*) from t_partitiontab partition(pmax);?查詢結果如下,可以看出數據已經分布到各個范圍的分區中:
05
merge合并分區
上述測試中,如果覺得pmax分區單獨存在浪費,數據可以與分區p5合并,可以使用分區合并merge將p5和pmax合并,合并后的分區可以使用原來的名稱,也可以使用新的名稱,參考如下語句:
alter table t_partitiontab merge partitions p5, pmax into partition pN;合并后,分區數據結果如下,可以看出數據已經合并在PN分區中:
使用分區交換exchange需注意:
1)?分區交換僅支持范圍和列表分區,不支持HASH分區。
2)?分區交換可以將非分區表的數據交換到分區表,也可以將分區表的數據交換到非分區表,本質上是源表和目標表數據的互換。
3)?分區交換要求分區表與交換表具有相同的結構(相同的表類型、相同的BRANCH選項、相同的列結構、相同的索引、相同的分布方式),否則會報“[-7000]:交換對象不匹配”的錯誤。
4)?不支持含全局索引的分區表與普通表進行交換分區操作。
5)?分區交換時不會進行數據校驗,如果交換表的數據不符合分區范圍,數據仍然會進入該分區。此時如果是范圍分區可以使用split拆分分區,系統會自動對數據進行重組。
6)?在生產環境中,為保證數據安全,建議對源表的數據備份后再做分區交換。
總結
以上是生活随笔為你收集整理的DM巧用分区交换将非分区表转换为分区表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GE OPC Server 源代码
- 下一篇: 数学公式教程latex版