读书笔记:Oracle组合分区:像俄罗斯套娃一样管理数据

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

Oracle组合分区:像俄罗斯套娃一样管理数据

什么是组合分区?

想象一下,你有一个巨大的文件柜(表),里面装满了文件(数据)。组合分区就像先按年份(范围分区)把文件分成几个大抽屉,然后在每个大抽屉里再按类别(哈希或列表分区)分成小格子。

核心特点:组合分区 = 一级分区 + 二级子分区

组合分区的9种"配方"

Oracle允许三种分区方式自由组合,就像调色板一样:

一级分区 二级分区 适用场景
范围分区 范围分区 时间维度多层细分
范围分区 列表分区 先按时间,再按类型
范围分区 哈希分区 先按时间,再均匀分布
列表分区 范围分区 先按类型,再按时间
列表分区 列表分区 多维度分类
列表分区 哈希分区 先按类型,再均匀分布
哈希分区 范围分区 先分布数据,再按时间
哈希分区 列表分区 先分布数据,再按类型
哈希分区 哈希分区 多层数据分布

实际案例:范围-哈希组合分区

业务场景

假设我们有一个销售记录表,需要:

  • 按年份进行大范围管理(方便数据归档)
  • 在每个年份内均匀分布数据(提高查询性能)

建表语句

CREATE TABLE composite_example (
    range_key_column date,    -- 范围分区键:日期
    hash_key_column int,      -- 哈希分区键:客户ID
    data varchar2(20)
)
PARTITION BY RANGE (range_key_column)    -- 第一级:按日期范围分区
SUBPARTITION BY HASH(hash_key_column)    -- 第二级:按客户ID哈希分区
SUBPARTITIONS 2                          -- 每个范围分区再分2个子分区
(
    -- 2021年之前的数据分区
    PARTITION part_1 VALUES LESS THAN('2021-01-01')
    (SUBPARTITION part_1_sub_1, SUBPARTITION part_1_sub_2),
    
    -- 2022年之前的数据分区  
    PARTITION part_2 VALUES LESS THAN('2022-01-01')
    (SUBPARTITION part_2_sub_1, SUBPARTITION part_2_sub_2)
);

数据存储结构

表: composite_example
├── 分区part_1 (2021年前数据)
│   ├── 子分区part_1_sub_1 (哈希值1的数据)
│   └── 子分区part_1_sub_2 (哈希值2的数据)
└── 分区part_2 (2022年前数据)
    ├── 子分区part_2_sub_1 (哈希值1的数据)
    └── 子分区part_2_sub_2 (哈希值2的数据)

数据路由过程

当插入一条新记录时:

  1. 范围路由:根据range_key_column决定进入part_1还是part_2
  2. 哈希路由:根据hash_key_column的哈希值决定进入该分区下的哪个子分区

更灵活的场景:范围-列表组合分区

业务需求

  • 2021年之前:数据量较小,只需要2个子分区(奇偶分类)
  • 2021年之后:数据量增大,且奇数代码数据更多,需要3个子分区

实现方案

CREATE TABLE composite_range_list_example (
    range_key_column date,      -- 范围分区键:日期
    code_key_column int,        -- 列表分区键:业务代码
    data varchar2(20)
)
PARTITION BY RANGE (range_key_column)
SUBPARTITION BY LIST(code_key_column)  -- 按代码值列表分区
(
    -- 2021年前:2个子分区
    PARTITION part_1 VALUES LESS THAN('2021-01-01')
    (SUBPARTITION part_1_sub_1 VALUES(1,3,5,7),   -- 奇数代码
     SUBPARTITION part_1_sub_2 VALUES(2,4,6,8)),  -- 偶数代码
     
    -- 2022年前:3个子分区(应对数据增长)
    PARTITION part_2 VALUES LESS THAN('2022-01-01')  
    (SUBPARTITION part_2_sub_1 VALUES(1,3),       -- 小奇数
     SUBPARTITION part_2_sub_2 VALUES(5,7),       -- 大奇数  
     SUBPARTITION part_2_sub_3 VALUES(2,4,6,8))   -- 偶数
);

最终分区结构

总共5个物理子分区:
- part_1_sub_1 (2021年前,代码1,3,5,7)
- part_1_sub_2 (2021年前,代码2,4,6,8)  
- part_2_sub_1 (2022年前,代码1,3)
- part_2_sub_2 (2022年前,代码5,7)
- part_2_sub_3 (2022年前,代码2,4,6,8)

组合分区的核心优势

1. 管理灵活性

  • 可以针对不同时期的数据采用不同的细分策略
  • 适应数据增长和业务变化的需求

2. 性能优化

  • 分区消除可以在两个层级上工作
  • 查询时可以跳过整个分区或只扫描相关子分区

3. 维护便捷

  • 可以针对单个子分区进行备份、恢复操作
  • 数据归档时可以直接删除整个时间分区

4. 存储效率

  • 只有子分区占用实际物理存储空间
  • 分区本身只是逻辑容器,开销极小

使用建议

选择组合分区当

  • 数据量非常大,需要多级管理
  • 业务查询模式涉及多个维度
  • 需要灵活的数据生命周期管理
  • 不同时期的数据特征差异较大

注意事项

  • 设计时要考虑业务查询模式
  • 子分区数量不是越多越好,要平衡管理和性能
  • 定期评估分区策略是否仍然适合当前数据特征

组合分区就像给数据仓库装上了"智能导航系统",让海量数据的管理变得井井有条!

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-10-29 17:27  认真就输  阅读(7)  评论(0)    收藏  举报