| 版本 | 分區類型 |
|---|---|
| 8.0 | Range |
| 8i | Hash、Composite (Range-Hash) |
| 9i | List、Composite (Range-List) |
| 11g | Interval、Reference、Virtual Column、System、Partition Advisor |
解決 Range 分區需手工預建分區的痛點。僅定義起始分區 + 間隔,數據到來自動創建新分區及本地索引。
CREATE TABLE SALES_PART (
TIME_ID NUMBER, REGION_ID NUMBER, ORDER_ID NUMBER,
ORDER_DATE DATE, SALES_QTY NUMBER(10,2), SALES_AMOUNT NUMBER(12,2)
)
PARTITION BY RANGE (ORDER_DATE)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) -- 每月一個分區
(
PARTITION P_FIRST VALUES LESS THAN ('01-JAN-2006') -- 唯一永久分區
);
NUMTOYMINTERVAL(1,'MONTH') 將數值轉為 INTERVAL YEAR TO MONTHALTER TABLE ... SET INTERVAL (...) 升級子表通過 FK 關聯父表,**無需冗余存儲分區鍵**,自動繼承父表分區策略。
-- 父表
CREATE TABLE ORDERS (ORDER_ID NUMBER, ORDER_DATE DATE, ...)
PARTITION BY RANGE (ORDER_DATE) (...);
-- 子表:無 ORDER_DATE 列
CREATE TABLE ORDER_ITEMS (ITEM_ID NUMBER, ORDER_ID NUMBER, ...)
PARTITION BY REFERENCE (FK_ORDER_ITEMS_ORDERS); -- 引用 FK 名稱
分區鍵可源自**虛擬列** (僅存元數據,不佔物理空間),打破「分區鍵必須為實體列」限制。
CREATE TABLE ACCOUNTS (
ACC_NO NUMBER(10) NOT NULL,
ACC_NAME VARCHAR2(50) NOT NULL,
ACC_LOC VARCHAR2(5),
ACC_BRANCH NUMBER(2) GENERATED ALWAYS AS (TO_NUMBER(SUBSTR(TO_CHAR(ACC_NO),1,2)))
)
PARTITION BY LIST (ACC_BRANCH) (...);
GENERATED ALWAYS AS (表達式)DBMS_ADVISOR 包調用10g 支援 Range/List/Hash,11g 新增 **Composite Partitioning** 支援 (Range-Range, Range-List, List-Range, List-List, List-Hash, Range-Hash)。