分區(qū)表的分類 Range partitioning(范圍分區(qū)) Hash partitioning(哈希分區(qū)) List partitioning(列表分區(qū)) Composite range-hash partitioning(范圍-哈希組合分區(qū)) Composite range-list partitioning(范圍-列表組合分區(qū))
何時選擇范圍分區(qū) 必須可以將表的記錄按照某一列值的范圍進行劃分。你想處理一些數(shù)據(jù),這些數(shù)據(jù)經(jīng)常是屬于某一個范圍內(nèi),例如月份。如果數(shù)據(jù)能夠按照分區(qū)的范圍均勻分布的話,那會獲得最佳性能。如果數(shù)據(jù)分布很不均勻的話,你可能不得不選擇其他分區(qū)方式。 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分區(qū) 如果數(shù)據(jù)不容易用范圍分區(qū),但你想提升性能和表的易管理性。 Hash分區(qū)提供了一個在指定數(shù)量的分區(qū)內(nèi)交叉均勻分布數(shù)據(jù)的方法。行根據(jù)分區(qū)鍵的hash值映射到相應分區(qū)中。創(chuàng)建和使用hash分區(qū)你可以靈活放置數(shù)據(jù),可以通過交叉訪問在不同I/O設備上的分區(qū)提升性能。 CREATE TABLE scubagear (id NUMBER, name VARCHAR2 (60)) PARTITION BY HASH (id) PARTITIONS 4 STORE IN (gear1, gear2, gear3, gear4);
分區(qū)表的設計 如何選擇分區(qū)的類型,如何選擇分區(qū)的列呢?在這之前你必須明確你的目的——易管理性和性能,你更注重哪個方面?分區(qū)表所影響的方面可以歸類為以下幾種:性能、易管理性、數(shù)據(jù)清理。 下面分別說說分區(qū)表對每一項的具體影響, 性能: 這一般是分區(qū)的主要目的。分區(qū)將大表變成了小表,當where之后的條件體現(xiàn)分區(qū)字段的具體值時,避免了全表掃描。 易于管理: 對于包含海量數(shù)據(jù)的大表,分區(qū)帶來的易于管理性是非常明顯的。當你建議一個基于非分區(qū)表的索引時,唯一的選擇就是創(chuàng)建整個索引。如果表被分區(qū),你就可以根據(jù)分區(qū)并行為此表創(chuàng)建索引,例如: alter index par_ind_01 reuild partition yy05; 除此之外你還可以同時的做很多事情,像改變表所在表空間、導出表,刪除表數(shù)據(jù)等等。 數(shù)據(jù)清理: 我們經(jīng)常會需要刪除表的一些歷史數(shù)據(jù),一般做法是delete,但是這會導致undo和redo的信息快速增長,而且影響數(shù)據(jù)庫整體性能。這時我們就可以利用drop某個分區(qū)來完成此任務,例如: alter table tab_a drop partition yy01; 當一個表的分區(qū)被刪除,對應的local索引也同時被刪除。如果還存在著global索引,那么它會變成unusable狀態(tài)。為了避免此事情的發(fā)生,你可以使用: alter table tab_a drop partition yy01 update global indexes;