Partition Table

在大量交易處理中,可以考慮使用分割表格(Partition Table)來提高應用系統的性能並方便資料管理,分割表格(Partition Table)可打破表格只能指定儲存在一個表格空間內的的基本觀念,也就是說在分割表格(Partition Table)的定義裡面可以將一個分割表格(Partition Table)指定數個表格空間儲存,如圖所示
















  • 使用分割表格(Partition Table)的優點如下

  1. 增強可用性︰如果表格的某個分割區塊(Partition)出現問題,表格在其他分割區塊(Partition)的資料仍然可用。
  2. 維護方便︰如果表格的某個分割區塊(Partition)出現問題,只修復該分割區塊(Partition)即可。
  3. 均衡I/O︰可以把不同的分割區塊(Partition)分散在不同的表格空間上,而不同的表格空間所對應到的資料檔與硬碟不同,所以可以改善整個系統性能。
  4. 改善查詢性能︰因已經將資料做區分為不同的分割區塊(Partition),所以可以提升查詢速度。

  • 表格與索引皆可做分割區塊(Partition)
  • 建置分割區塊(Partition)有下四種方式

  1. 區域分割(Range Partition)
  2. 雜湊分割(Hash Partition)
  3. 指定分割(List Partition)

區域分割(Range Partition)

區域分割(Range Partition)是分割表格(Partition Table)中最常使用的方式,當資料可以被劃分成邏輯範圍時如年度中的月份或是利用特定的值,這種類型的分割區塊(Partition)就可以做成區域分割(Range Partition)。當資料分割區塊在整個範圍中能被平均的劃分時性能最好。如果靠所選的資料分割區塊範圍劃分不平均的話會導致分割區塊在大小上明顯不同時,在效能上就會有所差異因此就需要考慮其他的分割區塊方法。 語法如下。

CREATE TABLE [ … column …]
PARTITION BY RANGE [(column_list)]
[PARTITION specifications ];

範例語法與執行步驟如下:

假設有一表格”TEST”要以欄位”DAY”來做成分割表格(Partition Table),每半年為一個分割區塊(Partition)因此欄位”DAY”就是所謂的”Partition Key”。如圖




步驟 1. 須建置所有分割區塊(Partition)會用到的表格空間,時上圖所示須建置”TEST_0601_TAB”、 ”TEST_0607_TAB”、 ”TEST_0701_TAB”、 ”TEST_0707_TAB”、 ”TEST_0801_TAB”、 ”TEST_0807_TAB”、 ”TEST_0901_TAB”、 ”TEST_0907_TAB”等表格空間。

步驟 2. 建置分割表格(Partition Table)。語法範例如下

CREATE TABLE TEST.TEST_TABLE (
ID               VARCHAR2(10) NOT NULL,
NAME              VARCHAR2(10) NOT NULL,
DAY           DATE NOT NULL)
PARTITION BY RANGE (DAY)
(PARTITION TEST_TABLE_0601 VALUES LESS THAN(TO_DATE('2006-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0601_TAB,
PARTITION TEST_TABLE_0607 VALUES LESS THAN(TO_DATE('2006-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0607_TAB,
PARTITION TEST_TABLE_0701 VALUES LESS THAN(TO_DATE('2007-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0701_TAB,
PARTITION TEST_TABLE_0707 VALUES LESS THAN(TO_DATE('2007-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0707_TAB,
PARTITION TEST_TABLE_0801 VALUES LESS THAN(TO_DATE('2008-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0801_TAB,
PARTITION TEST_TABLE_0807 VALUES LESS THAN(TO_DATE('2008-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0807_TAB,
PARTITION TEST_TABLE_0901 VALUES LESS THAN(TO_DATE('2009-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0901_TAB,
PARTITION TEST_TABLE_0907 VALUES LESS THAN(TO_DATE('2009-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_0907_TAB);

  • 以上的語法範例是利用欄位”DAY”作”Partition Key”,將資料從2006/01/01到2009/07/01每半年作一個分割區塊(Partition),因此當資料被新增(Insert)進來時會依照欄位”DAY”的值,來放置於不同的表格空間。
  • 作”Partition Key”的欄位不能允許空值(Null)。

雜湊分割(Hash Partition)
當資料不容易進行區域分割(Range Partition)時 ,但表格裡的資料實在太大為了效能與管理的因素必須做成分割表格(Partition Table)時,就可使用雜湊分割(Hash Partition)。雜湊分割(Hash Partition)只要是將一定數量的表格空間指定給此表格,Oracle會對”Partition Key”值作雜湊(Hash)運算方式放到到分割區塊(Partition)中。語法如下。
CREATE TABLE [ … column …]
PARTITION BY HASH [(column_list)]
[PARTITION specifications ];
範例語法如下:
CREATE TABLE TEST.TEST_TABLE(
ID               VARCHAR2(10) NOT NULL,
NAME              VARCHAR2(10) NOT NULL,
DEPARTMENT VARCHAR2(10) NOT NULL)
PARTITION BY HASH (DEPARTMENT)
(
PARTITION TEST_TABLE01 TABLESPACE TABLESPACE01,
PARTITION TEST_TABLE02 TABLESPACE TABLESPACE02,
PARTITION TEST_TABLE03 TABLESPACE TABLESPACE03,
PARTITION TEST_TABLE04 TABLESPACE TABLESPACE04,
PARTITION TEST_TABLE05 TABLESPACE TABLESPACE05,
PARTITION TEST_TABLE06 TABLESPACE TABLESPACE06
);

指定分割(List Partition)
指定分割(List Partition)可以明確地控制將資料放入指定的分割區塊(Partition)中,因此指定分割(List Partition)必須在每個分割區塊(Partition)中明確的為每個分割區塊(Partition)列指定一個欄位,這與雜湊分割(Hash Partition)最大的不同點就是雜湊分割(Hash Partition)無法指定欄位要放再哪個分割區塊(Partition)。語法如下。
CREATE TABLE [ … column …]
PARTITION BY LIST [(column)]
[PARTITION specifications ];
範例語法如下:
CREATE TABLE TEST.TEST_TABLE(
ID               VARCHAR2(10) NOT NULL,
NAME              VARCHAR2(10) NOT NULL,
DEPARTMENT VARCHAR2(10) NOT NULL)
PARTITION BY LIST (DEPARTMENT)
(
PARTITION TEST_TABLE01 VALUES ( HR, SALES) TABLESPACE TABLESPACE01,
PARTITION TEST_TABLE02 VALUES ( IT, RD) TABLESPACE TABLESPACE02,
PARTITION TEST_TABLE03 VALUES ( OP, NULL) TABLESPACE TABLESPACE03
);
指定分割(List Partition)的”Partition”只能指定一個欄位。
複合分割(Composite Partition)
除了以上三種基本的切割方式之外,還可以將者三種切割方式作複合使用,例如先做區域分割(Range Partition)後,每個分割區塊(Partition)內的資料再分布到幾個不同的表格空間中,這樣就是複合分割(Composite Partition)。複合分割(Composite Partition)原則是先使用區域分割(Range Partition),然後在每個分割區塊(Partition)內再切成不同的子區塊(Subpartition),語法如下。
CREATE TABLE [ … column …]
PARTITION BY RANGE [ (column_list1)]
  SUBPARTITION BY  [(column_list2)]
    SUBPARTITION 3 STORE IN [( tablespace_list)]
[PARTITION specifications ];
範例語法如下
CREATE TABLE TEST.TEST_TABLE(
ID               VARCHAR2(10) NOT NULL,
NAME              VARCHAR2(10) NOT NULL,
DAY                DATE NOT NULL,
DEPARTMENT VARCHAR2(10) NOT NULL)
PARTITION BY RANGE (DAY) SUBPARTITION BY HASH (DEPARTMENT)
SUBPARTITION 3 STORE IN (TABLESPACE01, TABLESPACE02, TABLESPACE03)
(
PARTITION TABLE01 VALUES LESS THAN(TO_DATE(’2006-01-01’,’YYYY-MM-DD’)),
PARTITION TABLE01 VALUES LESS THAN(TO_DATE(’2007-01-01’,’YYYY-MM-DD’)),
PARTITION TABLE03 VALUES LESS THAN(MAXVALUE)
);

建置與維護分割表格
針對單一分割區塊(Partition)執行查詢,範例語法如下:
SELECT * FROM TEST.TEST_TABLE PARTITION (TEST_TABLE_0601)
針對單一分割區塊(Partition)執行刪除,範例語法如下:
DELETE FROM TEST.TEST_TABLE PARTITION (TEST_TABLE01)
WHERE DEPARTMENT = ‘HR’;
針對單一分割區塊(Partition)執行修改,範例語法如下:
UPDATE TEST.TEST_TABLE PARTITION (TEST_TABLE01)
  SET DEPARTMENT = ‘HR_DEPT’
  WHERE DEPARTMENT = ‘HR’;
新增一個分割區塊(Partition),範例語法如下:
ALTER TABLE TEST.TEST_TABLE ADD PARTITION TEST_TABLE_1001 VALUES LESS THAN(TO_DATE('2010-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE TEST_1001_TAB;
合併一個分割區塊(Partition),範例語法如下:
ALTER TABLE TEST.TEST_TABLE MERGE PARTITIONS TEST_TABLE02, TEST_TABLE03 INTO PARTITION TEST_TABLE02;
移除一個分割區塊(Partition),範例語法如下:
ALTER TABLE TEST.TEST_TABLE DROP PARTITION TEST_TABLE01;
清空一個分割區塊(Partition),範例語法如下:
ALTER TABLE TEST.TEST_TABLE TRUNCATE PARTITION TEST_TABLE01;







 

沒有留言:

張貼留言