Oracle 8 推出分區選項,將大表水平切分至多個表空間,賦予物理層面可管理性。六大核心優勢:
| 類型 | 分區鍵 | 適用場景 |
|---|---|---|
| RANGE | 範圍值 (日期/數值) | 歷史資料、時間序列、滾動窗口 |
| LIST | 離散值清單 | 地區、部門、狀態碼等枚舉 |
| HASH | 雜湊值 | 均勻分佈、無明切分邏輯 |
| COMPOSITE | 複合 (Range-Hash/List) | 多維切分:時間+地區、時間+雜湊 |
| INTERVAL | 自動建立範圍分區 | 持續寫入的時間序列,免維護新增分區 |
| REFERENCE | 參考父表分區 | 父子表聯結分區對齊 |
| SYSTEM | 無分區鍵 | 特殊需求,Oracle 內部管理 |
場景:每月產生 30MB,1999 年資料按季度分四個分區,各配 100MB 表空間。
CREATE TABLESPACE ts_sale1999q1
DATAFILE '/u1/oradata/sales/sales1999_q1.dat' SIZE 100M
DEFAULT STORAGE (INITIAL 30M NEXT 30M MINEXTENTS 3 PCTINCREASE 0);
CREATE TABLESPACE ts_sale1999q2
DATAFILE '/u1/oradata/sales/sales1999_q2.dat' SIZE 100M
DEFAULT STORAGE (INITIAL 30M NEXT 30M MINEXTENTS 3 PCTINCREASE 0);
CREATE TABLESPACE ts_sale1999q3
DATAFILE '/u1/oradata/sales/sales1999_q3.dat' SIZE 100M
DEFAULT STORAGE (INITIAL 30M NEXT 30M MINEXTENTS 3 PCTINCREASE 0);
CREATE TABLESPACE ts_sale1999q4
DATAFILE '/u1/oradata/sales/sales1999_q4.dat' SIZE 100M
DEFAULT STORAGE (INITIAL 30M NEXT 30M MINEXTENTS 3 PCTINCREASE 0);
CREATE TABLE sales (
invoice_no NUMBER,
...,
sale_date DATE NOT NULL
)
PARTITION BY RANGE (sale_date) (
PARTITION sales1999_q1 VALUES LESS THAN (TO_DATE('1999-04-01','YYYY-MM-DD')) TABLESPACE ts_sale1999q1,
PARTITION sales1999_q2 VALUES LESS THAN (TO_DATE('1999-07-01','YYYY-MM-DD')) TABLESPACE ts_sale1999q2,
PARTITION sales1999_q3 VALUES LESS THAN (TO_DATE('1999-10-01','YYYY-MM-DD')) TABLESPACE ts_sale1999q3,
PARTITION sales1999_q4 VALUES LESS THAN (TO_DATE('2000-01-01','YYYY-MM-DD')) TABLESPACE ts_sale1999q4
);
-- Range 表新增
ALTER TABLE sales ADD PARTITION sales2000_q1
VALUES LESS THAN (TO_DATE('2000-04-01','YYYY-MM-DD')) TABLESPACE ts_sale2000q1;
-- Interval 表自動新增,無需手動
ALTER TABLE sales TRUNCATE PARTITION sales1999_q1;
-- 瞬間釋放空間,極速完成,生成最少 REDO
-- 1. 建立臨時表結構完全一致
CREATE TABLE sales_staging ... TABLESPACE staging_ts;
-- 2. 載入資料至臨時表 (可平行、無索引、無約束)
-- 3. 瞬間交換 (元資料操作,零資料移動)
ALTER TABLE sales EXCHANGE PARTITION sales2000_q1 WITH TABLE sales_staging
INCLUDING INDEXES WITHOUT VALIDATION;
-- 合併相鄰分區
ALTER TABLE sales MERGE PARTITIONS sales1999_q3, sales1999_q4
INTO PARTITION sales1999_h2 TABLESPACE ts_sale1999h2;
-- 分割大分區
ALTER TABLE sales SPLIT PARTITION sales2000_q1 AT (TO_DATE('2000-02-15','YYYY-MM-DD'))
INTO (PARTITION sales2000_q1_1 TABLESPACE ts1, PARTITION sales2000_q1_2 TABLESPACE ts2);
-- 移動分區至新表空間 (線上可用 DBMS_REDEFINITION)
ALTER TABLE sales MOVE PARTITION sales1999_q1 TABLESPACE new_ts ONLINE;
-- 本地索引:與表分區一一對應,維護最靈活
CREATE INDEX idx_sales_date ON sales(sale_date) LOCAL;
-- 全域索引:跨分區,維護較重,適合高基數唯一鍵
CREATE INDEX idx_sales_invoice ON sales(invoice_no) GLOBAL
PARTITION BY HASH (invoice_no) PARTITIONS 8;
EXPLAIN PLAN FOR
SELECT * FROM sales WHERE sale_date BETWEEN '1999-05-01' AND '1999-06-30';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 確認 PSTART/PSTOP 顯示 KEY/KEY 或具體分區號,而非 1/4
ALTER TABLE ... MOVE PARTITION ... COMPRESS FOR QUERY HIGH分區將「大表難題」轉化為「分區常規操作」。精準選型、自動化滾動、交換載入、本地索引、ILM 落地,讓 TB/PB 級大表同樣輕鬆可控。