我们的文章会在微信公众号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, -- 哈希分区键:客户IDdata 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的数据)
数据路由过程
当插入一条新记录时:
- 范围路由:根据
range_key_column决定进入part_1还是part_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)