Oracle 11g 引入 INTERVAL 分區,屬於範圍分區增強版:無需定義 MAXVALUE 分區,根據 INTERVAL 子句指定的間隔,自動按需創建分區以容納超出現有範圍的數據。
CREATE TABLE t_interval_part
PARTITION BY RANGE (created)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p1 VALUES LESS THAN (TO_DATE('2007-09-01', 'YYYY-MM-DD'))
)
AS SELECT * FROM dba_objects;
p1 覆蓋 2007-09-01 之前的數據。SYS_P113、SYS_P114...)。插入數據時,Oracle 根據分區鍵值計算目標分區,若該分區不存在則即時創建。中間缺失數據的月份不會預先創建空分區。
實測現象:先插入 11 月數據 → 創建 11 月分區(序號較小);後插入 10 月數據 → 創建 10 月分區(序號較大)。分區名稱序號反映創建時間先後,而非時間順序。
觸發分區創建的 INSERT 即使 ROLLBACK,新分區依然保留。推測分區創建在自治事務中執行,獨立於用戶事務提交/回滾。
-- 1. 創建表並插入 dba_objects 數據
CREATE TABLE t_interval_part
PARTITION BY RANGE (created)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION p1 VALUES LESS THAN (TO_DATE('2007-09-01','YYYY-MM-DD')))
AS SELECT * FROM dba_objects;
-- 2. 查看分區
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = 'T_INTERVAL_PART'
ORDER BY partition_position;
-- 3. 觀察分區名稱序號與高值的對應關係
-- SYS_P113 -> 2007-11-01 (先創建)
-- SYS_P114 -> 2007-10-01 (後創建)
-- SYS_P115 -> 2008-12-01 (中間月份無數據,不創建)
-- 4. 回滾測試
ROLLBACK;
-- 再次查詢,分區仍存在
ALTER TABLE ... RENAME PARTITION 重命名為語義化名稱(如 P_2024_01)。| 特性 | RANGE | INTERVAL |
|---|---|---|
| MAXVALUE 分區 | 必需 | 不需要 |
| 新分區創建 | 手動 ALTER TABLE ADD PARTITION | 自動按需創建 |
| 空分區 | 預創建 | 不創建 |
| 適用場景 | 固定範圍、歷史數據靜態 | 時間序列、持續增長、不確定壽命 |
INTERVAL 分區通過「按需創建、不創建空分區、回滾保留分區」三大機制,完美解決了時間序列數據長期維護的分區管理痛點。配合定期重命名、歸檔策略,是 11g+ 時代時間維度分區的首選方案。