第32期吐槽: PG大表激怒架构师,分区后居然不能创建唯一约束?
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
第32期吐槽:PG 没有全局索引
1、产品的问题点
PG 没有全局索引
2、问题点背后涉及的技术原理
PG的索引支持到表级别, 如果是分区表那么只能创建每个分区对应的本地索引, 不能针对分区表建立全局索引.
3、这个问题将影响哪些行业以及业务场景
使用了分区表, 且希望对非分区字段进行全局唯一约束的场景. 或需要非分区字段排他约束的场景。
分区表只能选择一种分区键, 如果要约束唯一性, 则必须包含分区键, 例如ID, 那么可以设置ID唯一, 或者带ID的如(ID, col1)唯一, 但是不能单独设置col1唯一. 原因是唯一约束是通过索引来实现的,一条记录进来后它一定会路由到某一个分区中,因此只要带上分区键,使用本地索引就能约束全局唯一。
使用了分区表, 并且在非分区字段有排序需求, 即使支持了merge sort还是觉得性能不够的用户. 必须最高速度从全局索引拿到结果.
4、会导致什么问题?
大表使用分区表后,带来的使用限制会特别多。
无法支持非分区字段进行全局唯一约束、排他约束的场景. 如,主外键关系的情况,被关联表字段必须是唯一的。
对非分区字段排序, 即使每个分区上有对应索引, 也需要访问所有分区, 然后进行merge sort, 有一定性能损耗(增加cpu和io消耗).
5、业务上应该如何避免这个坑
基本无解, 除非不使用分区表.
6、业务上避免这个坑牺牲了什么, 会引入什么新的问题
如果由于这些约束, 用户的大表不能使用分区表, 会导致用户在这些大表的访问性能下降、高频更新的大表垃圾回收不及时、膨胀等问题.
7、数据库未来产品迭代如何修复这个坑
希望内核层面支持分区表的全局索引
同时建议支持分区表的分区索引, 但是索引分区键 可以和 分区表的分区键不一样.
本期彩蛋-招商中,有需要的小伙伴可联系嵌入...
文章中的参考文档请点击阅读原文获得.
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: