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. 最佳实践

  1. 分区键:查询常用
  2. Interval:自动
  3. Local 索引:推荐
  4. 统计:分区级
  5. 归档:定期
  6. 命名:清晰
  7. 监控:大小
  8. 测试:性能
  9. 文档:设计
  10. 演练:定期

13. 参考资料

[1] Oracle Database VLDB and Partitioning Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/