Oracle 分區表將大表劃分為獨立管理的分區,實現查詢分區裁剪 (Partition Pruning)、分區級維護 (Truncate/Exchange/Move)、並行度提升。本文系統講解五大分區策略語法、子分區組合、索引分區選型與查詢技巧。
CREATE TABLE range_sales (
sale_id NUMBER PRIMARY KEY,
sale_date DATE,
amount NUMBER
)
PARTITION BY RANGE (sale_date) (
PARTITION p_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01','YYYY-MM-DD')) TABLESPACE ts_q1,
PARTITION p_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01','YYYY-MM-DD')) TABLESPACE ts_q2,
PARTITION p_2023_q3 VALUES LESS THAN (TO_DATE('2023-10-01','YYYY-MM-DD')) TABLESPACE ts_q3,
PARTITION p_2023_q4 VALUES LESS THAN (TO_DATE('2024-01-01','YYYY-MM-DD')) TABLESPACE ts_q4,
PARTITION p_max VALUES LESS THAN (MAXVALUE) TABLESPACE ts_archive -- 必須有 MAXVALUE 兜底
);
VALUES LESS THAN 定義上邊界,MAXVALUE 必須作為最後一個分區。-- 方式 A:指定分區數 + 表空間組 (循環映射)
CREATE TABLE hash_users (
user_id NUMBER PRIMARY KEY,
name VARCHAR2(50)
)
PARTITION BY HASH (user_id)
PARTITIONS 16
STORE IN (ts_hash_1, ts_hash_2, ts_hash_3, ts_hash_4);
-- 方式 B:顯式命名每個分區 (精確控制)
CREATE TABLE hash_users_named (
user_id NUMBER PRIMARY KEY
)
PARTITION BY HASH (user_id) (
PARTITION p1 TABLESPACE ts_1,
PARTITION p2 TABLESPACE ts_2,
...
PARTITION p16 TABLESPACE ts_16
);
CREATE TABLE list_regions (
order_id NUMBER PRIMARY KEY,
region VARCHAR2(20)
)
PARTITION BY LIST (region) (
PARTITION p_north VALUES ('BEIJING','TIANJIN','HEBEI') TABLESPACE ts_north,
PARTITION p_south VALUES ('GUANGDONG','GUANGXI','HAINAN') TABLESPACE ts_south,
PARTITION p_east VALUES ('SHANGHAI','JIANGSU','ZHEJIANG') TABLESPACE ts_east,
PARTITION p_west VALUES ('SICHUAN','YUNNAN','GUizHOU') TABLESPACE ts_west,
PARTITION p_other VALUES (DEFAULT) TABLESPACE ts_other -- 11g+ 支持 DEFAULT 分區
);
-- Range-Hash: 按月範圍分區,每月內按 user_id 哈希子分區
CREATE TABLE composite_sales (
sale_id NUMBER,
sale_date DATE,
user_id NUMBER
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY HASH (user_id)
SUBPARTITIONS 8 -- 每個範圍分區下 8 個哈希子分區
(
PARTITION p_2023_01 VALUES LESS THAN (DATE '2023-02-01') TABLESPACE ts_2023_01,
PARTITION p_2023_02 VALUES LESS THAN (DATE '2023-03-01') TABLESPACE ts_2023_02,
PARTITION p_max VALUES LESS THAN (MAXVALUE) TABLESPACE ts_archive
);
CREATE TABLE interval_sales (
sale_id NUMBER,
sale_date DATE
)
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) -- 自動按月創建新分區
(
PARTITION p_2023_01 VALUES LESS THAN (DATE '2023-02-01')
);
| 類型 | 語法關鍵字 | 結構 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|---|
| 局部索引 | LOCAL | 每個表分區對應一個索引分區,一一映射 | 分區維護自動同步 (Truncate/Drop/Exchange 不失效)、易管理 | 跨分區查詢需掃描多個索引分區 | OLTP、數據倉庫、大多數分區表首選 |
| 全局索引 | GLOBAL | 單一索引覆蓋所有分區,可自定義分區鍵 | 唯一性約束強制、跨分區點查快 | 分區維護導致索引 UNUSABLE 需重建、管理複雜 | 需全局唯一鍵、高頻點查主鍵非分區鍵 |
-- 局部索引 (推薦)
CREATE INDEX idx_sales_date_local ON range_sales(sale_date) LOCAL;
-- 全局索引 (可分區)
CREATE INDEX idx_sales_user_global ON range_sales(user_id) GLOBAL
PARTITION BY HASH (user_id) PARTITIONS 8;
-- 全局非分區索引
CREATE INDEX idx_sales_amount_global ON range_sales(amount) GLOBAL;
限制:哈希分區表不能創建全局非分區索引 (12c+ 放寬),組合分區表全局索引定義複雜,建議優先 Local。
SELECT * FROM range_sales PARTITION (p_2023_q1); -- 僅掃描該分區
SELECT * FROM range_sales PARTITION FOR (DATE '2023-05-15'); -- 11g+ 自動定位分區
ALTER TABLE ... ADD PARTITION (範圍/列表)ALTER TABLE ... DROP/TRUNCATE PARTITION (瞬間釋放空間,Local 索引自動同步)ALTER TABLE ... EXCHANGE PARTITION ... WITH TABLE ... (數據快速裝載/卸載,無數據移動)ALTER TABLE ... MOVE PARTITION ... TABLESPACE ... (遷移表空間,ONLINE 12.2+)ALTER TABLE ... SPLIT/MERGE PARTITION (拆分/合併分區)分區表是 Oracle 大數據處理的基石。掌握 Range/Hash/List/Composite/Interval 五大策略語法、Local vs Global 索引 權衡、分區維護 DDL 實戰,即可應對 TB 級表的查詢優化、歸檔清理、滾動加載等核心場景。記住:分區鍵選擇決定成敗,業務查詢模式決定分區鍵。