談一下如何設計Oracle 分區表


在談設計Oracle分區表之間先區分一下分區表表空間的個概念:

表空間:表空間是一個或多個數據文件的集合,所有數據對象都存放在指定的表空間中,但主要存放表,故稱表空間。

分區表:分區致力於解決支持極大表和索引的關鍵問題。它采用他們分解成較小和易於管理的稱為分區的片(piece)的方法。一旦分區被定義,SQL語句就可以訪問的操作某一個分區而不是整個表,因而提高管理的效率。分區對於數據倉庫應用程序非常有效,因為他們常常存儲和分析巨量的歷史數據。當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區后,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。

表分區的具體作用

    Oracle的分區表功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。

    通常,分區可以使某些查詢以及維護操作的性能大大提高。此外,分區還可以極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具。

     分區功能能夠將表、索引或索引組織表進一步細分為段,這些數據庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從數據庫管理員的角度來看,一個分區后的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使數據庫管理員在管理分區后的對象時有相當大的靈活性。但是,從應用程序的角度來看,分區后的表與非分區表完全相同,使用 SQL DML 命令訪問分區后的表時,無需任何修改。

在什么時候使用分區表呢?

    1、表的大小超過2GB

    2、表中包含歷史數據,新的數據被增加都新的分區中。

表分區的優缺點:

    優點:

    1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。

    2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;

    3、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;

    4、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。

    缺點:

    1、分區表相關:已經存在的表沒有方法可以直接轉化為分區表。不過 Oracle 提供了在線重定義表的功能。

    2、分區致力於解決支持極大表和索引的關鍵問題。它采用他們分解成較小和易於管理的稱為分區的片(piece)的方法。

分區表的分類 

    1、Range partitioning(范圍分區)
    2、Hash partitioning(哈希分區)
    3、List partitioning(列表分區)
    4、Composite range-hash partitioning(范圍-哈希組合分區)
    5、 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; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM