1. 程式人生 > >Oracle 分割槽表——Range分割槽

Oracle 分割槽表——Range分割槽

本博文少許理論資料來至DBA技術大牛http://blog.csdn.net/tianlesoftware/article/details/4717318,本著實踐式學習,書寫以下博文:


一、什麼是分割槽表
       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)  --一月份

結果如下圖:
       

至此我們建立、驗證、並向表中新增資料 完成。

查詢分割槽表:

--------------------- 
作者:子揚同學 
來源:CSDN 
原文:https://blog.csdn.net/rly101112/article/details/11682417 
版權宣告:本文為博主原創文章,轉載請附上博文連結!