天天看點

ORACLE分區表的設計

 分區表的概念

分區緻力于解決支援極大表和索引的關鍵問題。它采用他們分解成較小和易于管理的稱為分區的片(piece)的方法。一旦分區被定義,SQL語句就可以通路的操作某一個分區而不是整個表,因而提高管理的效率。分區對于資料倉庫應用程式非常有效,因為他們常常存儲和分析巨量的曆史資料。

分區表的分類

Range partitioning(範圍分區)

Hash partitioning(哈希分區)

List partitioning(清單分區)

Composite range-hash partitioning(範圍-哈希組合分區)

Composite range-list partitioning(範圍-清單組合分區)

何時選擇範圍分區

必須可以将表的記錄按照某一列值的範圍進行劃分。你想處理一些資料,這些資料經常是屬于某一個範圍内,例如月份。如果資料能夠按照分區的範圍均勻分布的話,那會獲得最佳性能。如果資料分布很不均勻的話,你可能不得不選擇其他分區方式。

CREATE TABLE sales

    ( invoice_no NUMBER,

      sale_year  INT NOT NULL,

      sale_month INT NOT NULL,

      sale_day   INT NOT NULL )

  PARTITION BY RANGE (sale_year, sale_month, sale_day)

    ( PARTITION sales_q1 VALUES LESS THAN (1999, 04, 01)

        TABLESPACE tsa,

      PARTITION sales_q2 VALUES LESS THAN (1999, 07, 01)

        TABLESPACE tsb,

      PARTITION sales_q3 VALUES LESS THAN (1999, 10, 01)

        TABLESPACE tsc,

      PARTITION sales_q4 VALUES LESS THAN (2000, 01, 01)

        TABLESPACE tsd );

何時選擇HASH分區

如果資料不容易用範圍分區,但你想提升性能和表的易管理性。 Hash分區提供了一個在指定數量的分區内交叉均勻分布資料的方法。行根據分區鍵的hash值映射到相應分區中。建立和使用hash分區你可以靈活放置資料,可以通過交叉通路在不同I/O裝置上的分區提升性能。

CREATE TABLE scubagear (id NUMBER, name VARCHAR2 (60))

PARTITION BY HASH (id)

PARTITIONS 4 STORE IN (gear1, gear2, gear3, gear4);

何時選擇清單分區

使用LIST分區你可以直接控制某些資料映射到某些分區。你可以為某個分區指定不連續的分區鍵值。這不同于RANGE分區(用鍵值的範圍劃分分區),也不同于HASH分區(不能控制某行映射到哪個分區)。

CREATE TABLE q1_sales_by_region

(deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2))

PARTITION BY LIST (state)

(PARTITION q1_northwest VALUES ('OR', 'WA'),

PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'),

PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'),

PARTITION q1_southeast VALUES ('FL', 'GA'),

PARTITION q1_northcentral VALUES ('SD', 'WI'),

PARTITION q1_southcentral VALUES ('OK', 'TX'));

 分區表的設計

 如何選擇分區的類型,如何選擇分區的列呢?在這之前你必須明确你的目的——易管理性和性能,你更注重哪個方面?分區表所影響的方面可以歸類為以下幾種:性能、易管理性、資料清理。

下面分别說說分區表對每一項的具體影響,

性能:

這一般是分區的主要目的。分區将大表變成了小表,當where之後的條件展現分區字段的具體值時,避免了全表掃描。

易于管理:

對于包含海量資料的大表,分區帶來的易于管理性是非常明顯的。當你建議一個基于非分區表的索引時,唯一的選擇就是建立整個索引。如果表被分區,你就可以根據分區并行為此表建立索引,例如:

alter index par_ind_01 reuild partition yy05;

除此之外你還可以同時的做很多事情,像改變表所在表空間、導出表,删除表資料等等。

資料清理:

我們經常會需要删除表的一些曆史資料,一般做法是delete,但是這會導緻undo和redo的資訊快速增長,而且影響資料庫整體性能。這時我們就可以利用drop某個分區來完成此任務,例如:

alter table tab_a drop partition yy01;

當一個表的分區被删除,對應的local索引也同時被删除。如果還存在着global索引,那麼它會變成unusable狀态。為了避免此事情的發生,你可以使用:

alter table tab_a drop partition yy01 update global indexes;