Oracle 从分区到Sharding(数据库核心业务表的分区设计)
1.分区与Sharding
2.分区概述
(1) 分区定义:
根据内部定义的规则,将一张表的数据拆分到多个数据段中
对应用透明,程序可以不做任何额外调整
可以通过分区列上的条件访问指定分区的数据,也可以通过分区扩展语句显式的访问
(2) 分区的优点
可维护性
可用性增强
OLTP:降低共享资源争用
OLAP:提升查询性能
(3) Oracle 分区历史演变
3.分区设计
(1) 范围分区:
①
适用场景
时间属性
关注近期数据
② 最佳实践
数据生命周期和访问范围
明确时间条件限定
定期清理过期分区
非主键优先本地索引
③ 优势
将表分割成大小相对一致的分区,分区数据量可控
TRUNCATE,DROP,EXCHANGE分区的方式清理过期数据
大部分带时间条件的查询只访问一个或几个分区
表的总体大小相对稳定
本地索引大小相对稳定
④ 面临挑战1
无法仅根据时间条件清理过期数据
DELETE方式清除效率低下并产生大量归档日志
DELETE方式清除无法有效释放分区和索引空
长时间不清理导致表的数据量迅速膨胀
长时间不清理导致表的分区数量不断增长
⑤ 解决方案1
INSERT + EXCHANGE方式进行数据清理
定期MERGE清理过的分区减少分区数量
避免DELETE效率低下问题
避免空间无法释放问题
⑥ 解决方案1
INSERT + EXCHANGE方式进行数据清理
定期MERGE清理过的分区减少分区数量
避免DELETE效率低下问题
避免空间无法释放问题
⑦ 面临挑战2
主表分区时间列在子表上不存在
主表时间列和子表时间列字段含义不同
数据清理过程会破坏主子表依赖关系
子表需要冗余主表分区字段
主子表外键约束导致无法通过DDL清理过期分区
⑧ 解决方案2
主表根据时间字段范围分区
子表通过外键建立参考分区
参考分区的数据清理不破坏主外键依赖关系
(2) 参考分区
适用场景
主表和子表采用相同的数据清理策略
子表没有合适的分区字段
主表和子表经常关联访问
(3) 哈希分区:
① 适用场景
没有时间属性
缺少区分数据的业务字段
② 最佳实践
分区键值列选择重复度不高的字段
分区数量应为2的幂
多创建全局索引
哈希分区索引可解决索引热点块问题
③ 优势
分区没有业务特点的数据
数据均匀分布
有效解决递增索引的热点块问题
④ 哈希全局分区索引
全局哈希分区索引比较适合像ID这种数据增长型索引,通过HASH算法,可以将递增的索引键值分布到多个分区上,从而避免系统争用。
(4) 列表分区
① 适用场景
地域,类型等有限的业务属性
访问一种或几种业务属性
通过业务属性可平均拆分数据
② 最佳实践
地区字段是常见候选
数据分布和访问方式确定分区键值划分
设定DEF AUL分区
③ 优势
分区方式和业务匹配度更好
数据如何在分区中存放的选择度更高
分区键值与分区的对应更加明确
(5) 复合键值列RANGE分区
(6) RANGE-RANGE复合分区
5. 12.2分区新特性
具体内容请参考-【2015 OTN】杨廷琨 - 从分区到Sharding:数据库核心业务表的分区设计:http://download.****.net/download/luomingkui1109/10005580