我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
白话解读Oracle哈希分区
什么是哈希分区?
想象你有一堆文件需要分到N个抽屉里。哈希分区的做法是:对每个文件的关键信息(如编号)进行"哈希计算",通过数学公式直接算出这个文件应该放进几号抽屉。你无法人为决定文件去向,完全由算法决定。
具体操作示例:
CREATE TABLE hash_example(hash_key_column date, -- 分区依据列data varchar2(20)
)
PARTITION BY HASH (hash_key_column) -- 按此列进行哈希计算
(partition part_1 tablespace p1, -- 分区1partition part_2 tablespace p2 -- 分区2
);
核心特点:
- 不可控性:行存放的分区由哈希函数决定,DBA无法干预
- 动态重分布:增加或删除分区时,所有数据需要重新计算并重新分布
- 需要选择合适的哈希键:应选择唯一性或高区分度的列,避免数据倾斜
为什么分区数要是2的幂?
通过实验可以清晰看到:
-
4个分区时(2²):数据均匀分布
分区p1: 12141行 ***************************** 分区p2: 12178行 ***************************** 分区p3: 12417行 ****************************** 分区p4: 12105行 *****************************
-
5个分区时:出现数据倾斜
分区p1: 6102行 **************(只有其他分区一半) 分区p2: 12180行 ***************************** 分区p5: 6040行 **************(只有其他分区一半)
-
8个分区时(2³):重新恢复均匀分布
所有分区行数都在6000-6300之间,分布均匀
哈希分区的适用场景:
- 分而治之:将大表拆分成多个小表管理
- 提高可用性:单个分区故障不影响其他分区访问
- 减少热点争用:将频繁更新的数据分散到多个分区
- 并行处理:适合大规模并行查询和DML操作
重要建议:
- 分区数量务必设置为2的幂次方(2、4、8、16、32...)
- 选择高基数(不同值多)的列作为哈希键
- 避免使用只有少数几个取值的列作为哈希键
哈希分区通过数学算法实现数据的自动分布,虽然牺牲了控制性,但换来了更好的负载均衡和可扩展性,特别适合海量数据的分布式存储和处理。
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)