天天看點

Oracle 分區表介紹

一. 分區表理論知識

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

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

分區提供以下優點:

       (1)由于将資料分散到各個分區中,減少了資料損壞的可能性;

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

       (3)可以将分區映射到不同的實體磁盤上,來分散IO;

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

Oracle 10g提供了以下幾種分區類型:

       (1)範圍分區(range);

       (2)哈希分區(hash);

       (3)清單分區(list);

       (4)範圍-哈希複合分區(range-hash);

       (5)範圍-清單複合分區(range-list)。

Range分區:

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

       如按照時間劃分,2010年1月的資料放到a分區,2月的資料放到b分區,在建立的時候,需要指定基于的列,以及分區的範圍值。

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

create table pdba (id number, time date) partition by range (time)

(

partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')),

partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')),

partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')),

partition p4 values less than (maxvalue)

)

Hash分區:

  對于那些無法有效劃分範圍的表,可以使用hash分區,這樣對于提高性能還是會有一定的幫助。hash分區會将表中的資料平均配置設定到你指定的幾個分區中,列所在分區是依據分區列的hash值自動配置設定,是以你并不能控制也不知道哪條記錄會被放到哪個分區中,hash分區也可以支援多個依賴列。例如:

create table test

(

transaction_id number primary key,

item_id number(8) not null

)

partition by hash(transaction_id)

(

partition part_01 tablespace tablespace01,

partition part_02 tablespace tablespace02,

partition part_03 tablespace tablespace03

);

在這裡,我們指定了每個分區的表空間。

List分區:

  List分區也需要指定列的值,其分區值必須明确指定,該分區列隻能有一個,不能像range或者hash分區那樣同時指定多個列做為分區依賴列,但它的單個分區對應值可以是多個。

  在分區時必須确定分區列可能存在的值,一旦插入的列值不在分區範圍内,則插入/更新就會失敗,是以通常建議使用list分區時,要建立一個default分區存儲那些不在指定範圍内的記錄,類似range分區中的maxvalue分區。

在根據某字段,如城市代碼分區時,可以指定default,把非分區規則的資料,全部放到這個default分區。例如:

create table custaddr

(

  id                     varchar2(15 byte)   not null,

  areacode   varchar2(4 byte)

 )

partition by list (areacode)

( partition t_list025 values ('025'),  

 partition t_list372 values ('372') , 

 partition t_list510 values ('510'), 

partition p_other values (default)

)