Oracle 9i 引入 List Partitioning,補足 Range Partitioning 僅支援標量數值(數字/日期)的缺口。List 分割允許使用離散的非標量值(字串、代碼)作為分割鍵,大幅提升大型表邏輯劃分的靈活度。
CREATE TABLE customer (
last_name VARCHAR2(30),
area_code NUMBER
)
PARTITION BY RANGE (area_code) (
PARTITION p_505 VALUES LESS THAN (505),
PARTITION p_212 VALUES LESS THAN (212),
PARTITION p_919 VALUES LESS THAN (919),
PARTITION p_252 VALUES LESS THAN (252),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
缺點:需將區域碼轉為數值範圍,維護繁瑣且不直觀。
CREATE TABLE customer (
col_values VARCHAR2(100),
state_name VARCHAR2(30)
)
PARTITION BY LIST (state_name) (
PARTITION yankees VALUES ('New York', 'Maine'),
PARTITION rebels VALUES ('North Carolina', 'South Carolina')
);
優勢:直接以州名分割,業務語意清晰,無需轉換數值範圍。
PARTITION BY LIST (region) (
PARTITION p_east VALUES ('NY','NJ','CT'),
PARTITION p_west VALUES ('CA','OR','WA'),
PARTITION p_other VALUES (DEFAULT) -- 自動收納其他地區
);
-- 先按年份 Range,再按地區 List 子分區
PARTITION BY RANGE (sale_year)
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE (
SUBPARTITION sp_east VALUES ('NY','NJ'),
SUBPARTITION sp_west VALUES ('CA','OR'),
SUBPARTITION sp_other VALUES (DEFAULT)
) (
PARTITION p_2022 VALUES LESS THAN (2023),
PARTITION p_2023 VALUES LESS THAN (2024)
);
EXCHANGE PARTITION 快速歸檔歷史資料。DBMS_REDEFINITION 線上重定義表,零停機遷移分割策略。List Partitioning 讓 Oracle 9i 分割表脫離「數值範圍」框架,直接對應業務實體,簡化設計、提升查詢效能、降低維運複雜度。對於大型 OLTP/OLAP 系統,善用 List 與複合分區是資料架構師的必備技能。