| 版本 | 關鍵特性 |
|---|---|
| 8.0 | Range 分區 (首創物理分區) |
| 8i | Hash 分區、Composite Range-Hash |
| 9i | List 分區、Composite Range-List |
| 10g | 索引組織表 (IOT) 分區、更多組合分區 |
| 11g | Interval、Reference、Virtual Column、Partition Advisor |
痛點:Range 分區需預建分區,忘記添加導致 ORA-14400 插入失敗。
方案:定義起始分區 + 間隔,Oracle 自動按需建立等寬分區。
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') );
ALTER TABLE SET INTERVAL(...) 轉型場景:訂單表 (父) 按日期 Range 分區,明細表 (子) 需同樣分區以支援 Partition-Wise Join。
傳統痛點:明細表須冗存分區鍵 (order_date),維護成本高、資料冗餘。
11g 解法:
-- 父表
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY, order_date DATE, ...
) PARTITION BY RANGE (order_date) (...);
-- 子表:無需存 order_date,直接引用父表 PK
CREATE TABLE order_items (
item_id NUMBER, order_id NUMBER, ...
CONSTRAINT fk_oi_o FOREIGN KEY (order_id) REFERENCES orders(order_id)
) PARTITION BY REFERENCE (fk_oi_o);
突破:分區鍵不再需為實體欄位,可為虛擬欄位運算式。
CREATE TABLE accounts (
acc_no NUMBER(10) NOT NULL,
acc_name VARCHAR2(50) NOT NULL,
acc_loc VARCHAR2(5),
-- 虛擬欄位:從帳號前 2 碼衍生分支代碼
acc_branch NUMBER(2) GENERATED ALWAYS AS
(TO_NUMBER(SUBSTR(TO_CHAR(acc_no), 1, 2)))
)
PARTITION BY LIST (acc_branch) (...);
ALTER TABLE ... PARTITION 實施腳本DBMS_ADVISOR 包調用11g 完善 6 種二級組合:Range-Range、Range-List、Range-Hash、List-Range、List-List、List-Hash,滿足多維度裁剪需求。