Oracle Partitioning 架构详解
Oracle Partitioning 架构详解
适用版本:Oracle Database 8.0+ / 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Partitioning 将大表/索引分解为小单元[1]:
详细见:Oracle 表分区策略详解、Oracle 分区表性能优化。
2. 优势
2.1 性能
- 分区裁剪
- 并行
- 管理性
2.2 可用性
- 分区独立
- 维护
- 减少影响
2.3 管理
- 分区操作
- 归档
- 命名
3. 分区类型
3.1 Range
PARTITION BY RANGE (sale_date) (
PARTITION p2025_01 VALUES LESS THAN (TO_DATE('2025-02-01', 'YYYY-MM-DD')),
PARTITION p2025_02 VALUES LESS THAN (TO_DATE('2025-03-01', 'YYYY-MM-DD')),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
3.2 List
PARTITION BY LIST (region) (
PARTITION p_north VALUES ('BJ', 'TJ'),
PARTITION p_south VALUES ('SH', 'GZ'),
PARTITION p_default VALUES (DEFAULT)
);
3.3 Hash
PARTITION BY HASH (id) PARTITIONS 8;
3.4 Composite
PARTITION BY RANGE (sale_date)
SUBPARTITION BY LIST (region) (
PARTITION p2025_01 VALUES LESS THAN (...) (
SUBPARTITION p2025_01_north VALUES ('BJ', 'TJ'),
SUBPARTITION p2025_01_south VALUES ('SH', 'GZ')
)
);
4. Interval
4.1 自动
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) (
PARTITION p_init VALUES LESS THAN (TO_DATE('2025-02-01', 'YYYY-MM-DD'))
);
4.2 优势
- 自动创建
- 无需手动
- 管理
5. Reference
4.1 子表继承
CREATE TABLE order_items (
order_id NUMBER,
item_id NUMBER,
CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES orders(id)
)
PARTITION BY REFERENCE (fk_order);
5.2 优势
- 子表跟随父表
- 简化
- 一致
6. 分区操作
6.1 添加
ALTER TABLE sales ADD PARTITION p2025_03
VALUES LESS THAN (TO_DATE('2025-04-01', 'YYYY-MM-DD'));
6.2 删除
ALTER TABLE sales DROP PARTITION p2025_01;
6.3 截断
ALTER TABLE sales TRUNCATE PARTITION p2025_01;
6.4 合并
ALTER TABLE sales MERGE PARTITIONS p2025_01, p2025_02
INTO PARTITION p2025_q1;
6.5 拆分
ALTER TABLE sales SPLIT PARTITION p2025_q1
AT (TO_DATE('2025-02-01', 'YYYY-MM-DD'))
INTO (PARTITION p2025_01, PARTITION p2025_02);
6.6 交换
ALTER TABLE sales EXCHANGE PARTITION p2025_01
WITH TABLE sales_temp;
7. 索引
7.1 Local
CREATE INDEX idx_local ON sales (sale_date) LOCAL;
-- 每分区独立
7.2 Global
CREATE INDEX idx_global ON sales (customer_id) GLOBAL;
-- 整表索引
7.3 选择
- Local:分区裁剪
- Global:跨分区查询
8. 分区裁剪
详细见:Oracle 分区裁剪详解。
- 静态裁剪
- 动态裁剪
- 性能
9. 应用场景
9.1 时间序列
- 按时间分区
- Range/Interval
- 归档
9.2 地域
- 按地区分区
- List
- 管理
9.3 大表
- 数据量大
- 分区
- 性能
10. 监控
10.1 视图
SELECT table_name, partitioning_type, partition_count
FROM user_part_tables;
SELECT table_name, partition_name, num_rows, blocks
FROM user_tab_partitions;
10.2 统计
EXEC DBMS_STATS.GATHER_TABLE_STATS(
'SCOTT', 'SALES',
granularity => 'ALL'
);
11. 常见问题
11.1 ORA-14400
- 分区不匹配
- 添加分区
- 检查
11.2 性能
- 未裁剪
- 优化
11.3 维护
- 定期添加
- 归档
- 监控
12. 最佳实践
- 分区键:查询常用
- Interval:自动
- Local 索引:推荐
- 统计:分区级
- 归档:定期
- 命名:清晰
- 监控:大小
- 测试:性能
- 文档:设计
- 演练:定期
13. 参考资料
[1] Oracle Database VLDB and Partitioning Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/