原文: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分區表基本操作如上,高級操作,如分區表下在分區,建立視圖等,未完待續。