oracle數據庫分區的幾種方式

範圍分區

每個分區都由一個分區鍵值範圍指定(對於一個以日期列作爲分區鍵的表,“2005 年 1 月”分區包含分區鍵值爲從“2005 年 1 月 1 日”到“2005 年 1 月 31 日”的行)。

列表分區

每個分區都由一個分區鍵值列表指定(對於一個地區列作爲分區鍵的表,“北美”分區可能包含值“加拿大”“美國”和“墨西哥”)。

散列分區

將散列算法用於分區鍵來確定指定行所在的分區

組合範圍散列分區

範圍和散列分區技術的組合,通過該組合,首先對錶進行範圍分區,然後針對每個單獨的範圍分區再使用散列分區技術進一步細分。索引組織表只能進行範圍分區。

組合範圍列表分區

範圍和列表分區技術的組合,通過該組合,首先對錶進行範圍分區,然後針對每個單獨的範圍分區再使用列表分區技術進一步細分。索引組織表可以按範圍、列表或散列進行分區。



一.範圍分區:
範圍分區將數據基於範圍映射到每一個分區,這個範圍是你在創建分區時指定的分區鍵決定的。這種分區方式是最爲常用的,並且分區鍵經常採用日期。舉個例子:你可能會將銷售數據按照月份進行分區。
當使用範圍分區時,請考慮以下幾個規則:
1、每一個分區都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區中的上限值。分區鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分區中。
2、所有分區,除了第一個,都會有一個隱式的下限值,這個值就是此分區的前一個分區的上限值。
3、在最高的分區中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分區中的任何分區鍵的值,也可以理解爲高於任何分區中指定的VALUE LESS THEN的值,同時包括空值。

例一:
假設有一個CUSTOMER表,表中有數據200000行,我們將此表通過CUSTOMER_ID進行分區,每個分區存儲100000行,我們將每個分區保存到單獨的表空間中,這樣數據文件就可以跨越多個物理磁盤。下面是創建表和分區的代碼,如下:
CREATE TABLE CUSTOMER 

    CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, 
    FIRST_NAME VARCHAR2(30) NOT NULL, 
    LAST_NAME   VARCHAR2(30) NOT NULL, 
    PHONE        VARCHAR2(15) NOT NULL, 
    EMAIL        VARCHAR2(80), 
    STATUS       CHAR(1) 

PARTITION BY RANGE (CUSTOMER_ID) 

    PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01, 
    PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02 
)
例二:按時間劃分
CREATE TABLE ORDER_ACTIVITIES 

    ORDER_ID      NUMBER(7) NOT NULL, 
    ORDER_DATE    DATE, 
    TOTAL_AMOUNT NUMBER, 
    CUSTOTMER_ID NUMBER(7), 
    PAID           CHAR(1) 

PARTITION BY RANGE (ORDER_DATE) 
(
PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,
PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
)

例三:MAXVALUE
CREATE TABLE RangeTable

idd INT PRIMARY KEY , 
iNAME VARCHAR(10), 
grade INT 

PARTITION BY RANGE (grade) 

      PARTITION part1 VALUES LESS THEN (1000) TABLESPACE Part1_tb, 
      PARTITION part2 VALUES LESS THEN (MAXVALUE) TABLESPACE Part2_tb 
);

二.列表分區:
該分區的特點是某列的值只有幾個,基於這樣的特點我們可以採用列表分區。
例一
CREATE TABLE PROBLEM_TICKETS 

    PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY, 
    DESCRIPTION VARCHAR2(2000), 
    CUSTOMER_ID NUMBER(7) NOT NULL, 
    DATE_ENTERED DATE NOT NULL, 
    STATUS       VARCHAR2(20) 

PARTITION BY LIST (STATUS) 

      PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01, 
      PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02

);
例二
CREATE TABLE ListTable

    id    INT PRIMARY KEY , 
    name VARCHAR (20), 
    area VARCHAR (10) 

PARTITION BY LIST (area) 

    PARTITION part1 VALUES ('guangdong','beijing') TABLESPACE Part1_tb, 
    PARTITION part2 VALUES ('shanghai','nanjing') TABLESPACE Part2_tb 
);

三.散列分區:
這類分區是在列值上使用散列算法,以確定將行放入哪個分區中。當列的值沒有合適的條件時,建議使用散列分區。
散列分區爲通過指定分區編號來均勻分佈數據的一種分區類型,因爲通過在I/O設備上進行散列分區,使得這些分區大小一致。
例一:
CREATE TABLE HASH_TABLE 

COL NUMBER(8), 
INF VARCHAR2(100) 

PARTITION BY HASH (COL) 

PARTITION PART01 TABLESPACE HASH_TS01, 
PARTITION PART02 TABLESPACE HASH_TS02, 
PARTITION PART03 TABLESPACE HASH_TS03 
)
簡寫:
CREATE TABLE emp
(
    empno NUMBER (4),
    ename VARCHAR2 (30),
    sal   NUMBER 
)
PARTITION BY HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

hash分區最主要的機制是根據hash算法來計算具體某條紀錄應該插入到哪個分區中,hash算法中最重要的是hash函數,Oracle中如果你要使用hash分區,只需指定分區的數量即可。建議分區的數量採用2的n次方,這樣可以使得各個分區間數據分佈更加均勻。

四、組合分區

(範圍-散列分區,範圍-列表分區)

範圍-散列分區

create table graderecord  
(  
  sno varchar2(10),  
  sname varchar2(20),  
  dormitory varchar2(3),  
  grade int  
)  
partition by range(grade)  
subpartition by hash(sno,sname)  
(  
  partition p1 values less than(75)  
            (  
               subpartition sp1,subpartition sp2  
            ),  
  partition p2 values less than(maxvalue)  
            (  
               subpartition sp3,subpartition sp4  
            )  
);  

 以grade劃分範圍,然後以sno和sname劃分散列分區,當數據量大的時候散列分區則趨於“平均”。

範圍-列表分區

create table MobileMessage  
(  
 ACCT_MONTH VARCHAR2(6), -- 帳期 格式:年月 YYYYMM  
 AREA_NO VARCHAR2(10), -- 地域號碼   
 DAY_ID VARCHAR2(2), -- 本月中的第幾天 格式 DD  
 SUBSCRBID VARCHAR2(20), -- 用戶標識   
 SVCNUM VARCHAR2(30) -- 手機號碼  
)  
partition by range(ACCT_MONTH,AREA_NO) subpartition by list(DAY_ID)  
(  
  partition p1 values less than('200705','012')  
  (  
    subpartition shangxun1 values('01','02','03','04','05','06','07','08','09','10'),  
    subpartition zhongxun1 values('11','12','13','14','15','16','17','18','19','20'),  
    subpartition xiaxun1 values('21','22','23','24','25','26','27','28','29','30','31')  
  ),  
  partition p2 values less than('200709','014')  
  (  
    subpartition shangxun2 values('01','02','03','04','05','06','07','08','09','10'),  
    subpartition zhongxun2 values('11','12','13','14','15','16','17','18','19','20'),  
    subpartition xiaxun2 values('21','22','23','24','25','26','27','28','29','30','31')  
  ),  
  partition p3 values less than('200801','016')  
  (  
    subpartition shangxun3 values('01','02','03','04','05','06','07','08','09','10'),  
    subpartition zhongxun3 values('11','12','13','14','15','16','17','18','19','20'),  
    subpartition xiaxun3 values('21','22','23','24','25','26','27','28','29','30','31')  
  )  
)  








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章