Data Warehouse Guide閱讀筆記(七):partition table

asword發表於2009-02-09
作者: NinGoo(http://ningoo.itpub.net)
發表於: 2006.10.29 00:25
分類: DW&BI
出處: http://ningoo.itpub.net/post/2149/224551
---------------------------------------------------------------[@more@]

分割槽表(partition table)在資料倉儲中的重要性不言而寓,資料倉儲的事實表中的資料量一般都比較大,而且很多時候是和時間相關的歷史資料,使用範圍分割槽是最合適的,但有時也要結合實際考慮其他的分割槽方式。

分割槽有三種基本的方式:range,hash和list。某個分割槽還可以繼續進行子分割槽,所以,上面三種基本的分割槽還可以組成兩種組合分割槽:range-hash和range-list。

Range partition

範圍分割槽就是安裝分割槽鍵的不同範圍的資料進入到不同的分割槽當中,對於按照時間延續性的歷史資料,這種分割槽非常合適。所以這種分割槽也是最常見的分割槽形式。

例如,對於一個銷售記錄的表,可以按照銷售時間來分割槽,每個月的資料都單獨做為一個分割槽:

CREATE TABLE sales_range
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY RANGE(sales_date)
(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY')));

注意,分割槽表示式中是一個小於的關係,也就是不包括邊界的,等於邊界值的資料會進入到下一個分割槽。如果我們還有些資料在所有的分割槽定義之外,那麼可以定義一個條件為MAXVALUE的分割槽,例如partition sales_other values less than(Maxvalue),則不符合前面所有分割槽條件的資料都會進入這個“預設分割槽”。

如果你遇到以下情況,考慮使用範圍分割槽是非常合適的:
1.對於一個大表,經常使用範圍條件來查詢的,可以考慮將該條件作為分割槽鍵進行反問分割槽。
2.你希望對錶中的資料滾動更新。比如保持36個月的銷售記錄,每個月刪除36個月前的分割槽,再建一個新的分割槽,將新的一個月的記錄加進來。
3.當一個表中的資料量非常大的時候,一些管理任務,比如備份恢復什麼的,都會花費相當長的時間。而將這些表改造成分割槽表對於簡化這些管理任務相當有效,可以針對單個的分割槽來進行管理

Hash partition

Hash分割槽是,根據oracle內部的一種hash演算法,將不同的資料放到不同的分割槽當中,因此能夠將所有的資料比較平均的分到所有的分割槽中,是各個分割槽中的資料量比較平衡。

Oracle採用的是一種線性hash演算法,分割槽的數目建議是2的指數個,比如2,4,8,16......

下面是4個分割槽的例子:

CREATE TABLE sales_hash
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4;

由於hash分割槽不是按照資料本身的一些邏輯來分割槽的,所以對於歷史資料不合適,主要用來將資料平衡到各個分割槽當中。而且,hash分割槽的分割槽排除只能基於等於條件。

使用hash分割槽,你可以:
1.對於一些大資料量的表,提供更好的可用性和可管理性。這個算是所有分割槽表的共性。
2.防止資料在不同分割槽表中間分佈不均。這個是hash分割槽的特性。
3.對於經常使用等於條件或者in條件的查詢,hash分割槽可以很好的使用分割槽排除和分割槽級連線。這個可以算hash分割槽的一個限制條件。

List partition

List分割槽可能是用的比較少的一種分割槽方式了。採用list分割槽,你可以完全的控制資料到分割槽的對映,不想範圍分割槽只能指定某個範圍的資料到某個分割槽。對於一些沒有明顯範圍性的離散資料,採用list分割槽就比較合適了。

比如按照銷售的地點進行list分割槽:

CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(PARTITION sales_west VALUES('California', 'Hawaii') COMPRESS,
PARTITION sales_east VALUES('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'));

對於list分割槽,如果有其他不符合上面所有分割槽定義條件的資料,可以建一個default分割槽來存放,就好像Range分割槽的Maxvalue一樣:PARTITION sales_other VALUES(DEFAULT))。

List分割槽還有一個限制,就是分割槽鍵只能是一個列,而不像Range和hash分割槽的分割槽鍵可以是多個列的組合,當然,也有限制,最多不能超過16個列的組合

Composite partition

Oracle只有兩種組合分割槽方式,Range-hash和Range-list。組合分割槽的有點就是集合了兩種不同分割槽方式的優點。而且,對於每個子分割槽,oracle都單獨建了一個segment

Range-hash分割槽的例子:

CREATE TABLE sales_range_hash(
s_productid NUMBER,
s_saledate DATE,
s_custid NUMBER,
s_totalprice NUMBER)
PARTITION BY RANGE (s_saledate)
SUBPARTITION BY HASH (s_productid) SUBPARTITIONS 8
(PARTITION sal99q1 VALUES LESS THAN (TO_DATE('01-APR-1999', 'DD-MON-YYYY')),
PARTITION sal99q2 VALUES LESS THAN (TO_DATE('01-JUL-1999', 'DD-MON-YYYY')),
PARTITION sal99q3 VALUES LESS THAN (TO_DATE('01-OCT-1999', 'DD-MON-YYYY')),
PARTITION sal99q4 VALUES LESS THAN (TO_DATE('01-JAN-2000', 'DD-MON-YYYY')));

Range-list分割槽的例子:

CREATE TABLE quarterly_regional_sales
(deptno NUMBER, item_no VARCHAR2(20),
txn_date DATE, txn_amount NUMBER, state VARCHAR2(2))
PARTITION BY RANGE (txn_date)
SUBPARTITION BY LIST (state)
SUBPARTITION TEMPLATE(
SUBPARTITION northwest VALUES ('OR', 'WA') TABLESPACE ts1,
SUBPARTITION southwest VALUES ('AZ', 'UT', 'NM') TABLESPACE ts2,
SUBPARTITION northeast VALUES ('NY', 'VM', 'NJ') TABLESPACE ts3,
SUBPARTITION southeast VALUES ('FL', 'GA') TABLESPACE ts4,
SUBPARTITION northcentral VALUES ('SD', 'WI') TABLESPACE ts5,
SUBPARTITION southcentral VALUES ('NM', 'TX') TABLESPACE ts6)
(
PARTITION q1_1999 VALUES LESS THAN(TO_DATE('1-APR-1999','DD-MON-YYYY')),
PARTITION q2_1999 VALUES LESS THAN(TO_DATE('1-JUL-1999','DD-MON-YYYY')),
PARTITION q3_1999 VALUES LESS THAN(TO_DATE('1-OCT-1999','DD-MON-YYYY')),
PARTITION q4_1999 VALUES LESS THAN(TO_DATE('1-JAN-2000','DD-MON-YYYY')));

注意中間的template關鍵字,使用template,就不必要為每個分割槽的子分割槽都單獨做一次定義了,所有分割槽的子分割槽都會使用template定義的子分割槽條件和子分割槽名字

(需要引用, 請註明出處: http://ningoo.itpub.net)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-1017045/,如需轉載,請註明出處,否則將追究法律責任。

相關文章