Oracle 分區表-Range分區


原文:http://www.tuicool.com/articles/MzeM7r

一、什么是分區表

       Oracle提供了分區技術以支持VLDB(Very Large DataBase)。分區表通過對分區列的判斷,把分區列不同的記錄,放到不同的分區中。分區完全對應用透明。

       Oracle的分區表可以包括多個分區, 每個分區都是一個獨立的段( SEGMENT),可以存放到不同的表空間中 。查詢時可以通過查詢表來訪問各個分區中的數據,也可以通過在查詢時直接指定分區的方法來進行查詢。

 二、什么時候用分區表

When to Partition a Table 什么時候需要分區表,官網的 2 個建議如下:

(1)Tables greater than 2GB should always be considered for partitioning.

(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.

 

三、分區表優點

       (1)由於將數據分散到各個分區中,減少了數據損壞的可能性;

       (2)可以對單獨的分區進行備份和恢復;

       (3)可以將分區映射到不同的物理磁盤上,來分散IO;

       (4)提高可管理性、可用性和性能。

四、分區表類型

       (1)范圍分區(range)——我們這篇博文的內容;

       (2)哈希分區(hash);

       (3)列表分區(list);

       (4)范圍-哈希復合分區(range-hash);

       (5)范圍-列表復合分區(range-list)。

五、Range 分區

Range分區是應用范圍比較廣的表分區方式,它是以列的值的范圍來做為分區的划分條件,將記錄存放到列值所在的range分區中。

       如按照時間划分,2010年1月的數據放到a分區,2月的數據放到b分區,在創建的時候,需要指定基於的列,以及分區的范圍值。

       在按時間分區時, 如果某些記錄暫無法預測范圍,可以創建 maxvalue 分區,所有不在指定范圍內的記錄都會被存儲到 maxvalue 所在分區中。

六、Range分區實例說明

例子:創建一張表,表有兩個字段(ID、TIME),我們完成對TIME列的范圍分區,即將1-12月創建成對應的12個分區表,對分區表及分區表數據進行增刪查改操作。

創建分區表:

創建表同時完成對表進行分區(按月份分區)

 
/*創建分區表*/
create table pdba (id number, time date) partition by range (time) (  partition p1 values less than (to_date('2013-02-1', 'yyyy-mm-dd')),  partition p2 values less than (to_date('2013-03-1', 'yyyy-mm-dd')),  partition p3 values less than (to_date('2013-04-1', 'yyyy-mm-dd')),  partition p4 values less than (to_date('2013-05-1', 'yyyy-mm-dd')),  partition p5 values less than (to_date('2013-06-1', 'yyyy-mm-dd')),  partition p6 values less than (to_date('2013-07-1', 'yyyy-mm-dd')),  partition p7 values less than (to_date('2013-08-1', 'yyyy-mm-dd')),  partition p8 values less than (to_date('2013-09-1', 'yyyy-mm-dd')),  partition p9 values less than (to_date('2013-10-1', 'yyyy-mm-dd')),  partition p10 values less than (to_date('2013-11-1', 'yyyy-mm-dd')),  partition p11 values less than (to_date('2013-12-1', 'yyyy-mm-dd')),  partition p12 values less than (to_date('2014-01-1', 'yyyy-mm-dd'))  --partition p13 values less than (maxvalue) --不建議使用 )

查詢所有分區表,驗證分區表是否創建成功。

select * from ALL_TAB_PARTITIONS a --不能加任何where條件

結果如下圖:

添加數據:

為了測試效果,我們添加120萬條數據,每月添加10萬條數據:

 
/*添加數據*/
declare   
begin for n in 1..100000 LOOP      -- insert into sale_data select * from sale_data;       insert into pdba VALUES(1,to_date('2013-01-05','yyyy-mm-dd'));       insert into pdba VALUES(2,to_date('2013-02-05','yyyy-mm-dd'));       insert into pdba VALUES(3,to_date('2013-03-05','yyyy-mm-dd'));       insert into pdba VALUES(4,to_date('2013-04-05','yyyy-mm-dd'));       insert into pdba VALUES(5,to_date('2013-05-05','yyyy-mm-dd'));       insert into pdba VALUES(6,to_date('2013-06-05','yyyy-mm-dd'));       insert into pdba VALUES(7,to_date('2013-07-05','yyyy-mm-dd'));       insert into pdba VALUES(8,to_date('2013-08-05','yyyy-mm-dd'));       insert into pdba VALUES(9,to_date('2013-09-05','yyyy-mm-dd'));       insert into pdba VALUES(10,to_date('2013-10-05','yyyy-mm-dd'));       insert into pdba VALUES(11,to_date('2013-11-05','yyyy-mm-dd'));       insert into pdba VALUES(12,to_date('2013-12-05','yyyy-mm-dd')); end loop; end;

測試數據是否添加正確:

先查看物理表記錄:

/*驗證*/
select count(*) from pdba
結果如下圖:
 

再隨機查看分區表,數據, 比如我們查看12月份的分區表數據,理論應該是10W條。

/*分區表查詢*/
select count(*) from pdba partition(p12) --一月份
 
       

至此我們創建、驗證、並向表中添加數據 完成。

 

查詢分區表:

/*分區表查詢*/
select * from pdba partition(p12) --十二月份

刪除分區表:

( 數據也會被刪除 )

/*刪除分區表*/
ALTER TABLE pdba DROP PARTITION P12;

當我們再次查詢十二月份的分區表時:
/*分區表查詢*/
select * from pdba partition(p12) --十二月份
 
結果如下:

而我們物理表中數據也會減少10w條。

select count(*) from pdba

結果如下:
 

增加分區表:

現在的物理表只有1到11月份的分區表,那我們再次添加12月份的分區表並再次添加10w條數據

/*增加分區表*/
ALTER TABLE pdba ADD PARTITION P12 VALUES LESS THAN(TO_DATE('2014-01-01','YYYY-MM-DD'));


添加數據:

/*添加數據*/
declare   
begin for n in 1..100000 LOOP   insert into pdba VALUES(12,to_date('2013-12-05','yyyy-mm-dd')); end loop; end;


再次查詢十二月份的分區表驗證操作是否成功

/*分區表查詢*/
select count(*) from pdba partition(p12) --十二月份


結果如圖:

 

合並分區表:

例子:將11月和12月的分區表合並在一起。

/*合並分區表*/
ALTER TABLE pdba MERGE PARTITIONS p11, p12 INTO PARTITION p13


分區表合並后,原分區表空間被釋放,原數據均轉移到新的表空間下。

現在查詢新的分區表,數據應該為20w條。

select count(*) from pdba partition(p13)


結果如圖:

分割分區表:

 

例子:將p13分區表分割成p11和p12分區表,即將11月和12月數據重新分割開。

/*一個分區表分割成兩個分區表*/
alter table pdba split Partition p13 at (to_date('2013-12-01','yyyy-mm-dd')) into (Partition p11,Partition p12);


過程和合並分區表下相反。

現在p11和p12表空間和數據重新恢復和添加。

11月和12月各10w條數據

更改分區表名:

--更改分區表名 
alter table pdba rename Partition p11 to p22;

增刪查改分區表的數據:

操作與物理表幾乎相同, 只是操作分區表時在分區表前加入 物理表名稱即可。具體如下圖:

 
--查詢分區表數據
select DISTINCT * from pdba partition(p12) --修改分區表數據 update pdba partition(p12) p set p.time = to_date('2013-12-08','yyyy-mm-dd'); --增加分區表數據 insert into pdba partition(p12) p VALUES(1,to_date('2013-12-29','yyyy-mm-dd')); --刪除分區表數據 delete from pdba partition(p12) t where t.id = 1

七、附錄:

顯示分區表信息 

顯示數據庫所有分區表的信息:DBA_PART_TABLES 

顯示當前用戶可訪問的所有分區表信息:ALL_PART_TABLES 

顯示當前用戶所有分區表的信息:USER_PART_TABLES 

顯示表分區信息 顯示數據庫所有分區表的詳細分區信息:DBA_TAB_PARTITIONS 

顯示當前用戶可訪問的所有分區表的詳細分區信息:ALL_TAB_PARTITIONS 

顯示當前用戶所有分區表的詳細分區信息:USER_TAB_PARTITIONS 

顯示子分區信息 顯示數據庫所有組合分區表的子分區信息:DBA_TAB_SUBPARTITIONS 

顯示當前用戶可訪問的所有組合分區表的子分區信息:ALL_TAB_SUBPARTITIONS 

顯示當前用戶所有組合分區表的子分區信息:USER_TAB_SUBPARTITIONS 

顯示分區列 顯示數據庫所有分區表的分區列信息:DBA_PART_KEY_COLUMNS 

顯示當前用戶可訪問的所有分區表的分區列信息:ALL_PART_KEY_COLUMNS 

顯示當前用戶所有分區表的分區列信息:USER_PART_KEY_COLUMNS 

顯示子分區列 顯示數據庫所有分區表的子分區列信息:DBA_SUBPART_KEY_COLUMNS 

顯示當前用戶可訪問的所有分區表的子分區列信息:ALL_SUBPART_KEY_COLUMNS 

顯示當前用戶所有分區表的子分區列信息:USER_SUBPART_KEY_COLUMNS 

Range分區表基本操作如上,高級操作,如分區表下在分區,建立視圖等,未完待續。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM