大家好。 我和一个伙伴参考PG社区上陈华军基于行表压缩的讨论,参考和移植代码、适配openGauss支持行表压缩功能。现在我附上相应的设计文档和开发分支,希望对这块有兴趣的社区伙伴可以一起来研究探讨和完善。目前该方案在只读场景可以达到接近20%的压缩效果,常用读写场景可以基本达到70%左右的压缩效果。
设计文档:https://gitee.com/wuyuechuan/openGauss-server/blob/page_compress/%E8%A1%8C%E... 代码仓库:https://gitee.com/wuyuechuan/openGauss-server/tree/page_compress/ 遗留问题:https://gitee.com/wuyuechuan/openGauss-server/issues/I3HB50
方案主要设计:
以页(page)为粒度对数据进行压缩,压缩后用2个文件存储,分别是压缩地址文件(扩展名.pca)和压缩数据文件(扩展名.pcd)。以下简称为“地址文件”和“数据文件”。
① 数据文件(扩展名.pcd)中最小的存储空间分配单元为chunk,每个chunk的大小可配置为页(page)大小的1/2,1/4或1/8。
② 地址文件(扩展名.pca)中存储每个压缩页在数据文件中对应的chunk编号数组。
举个例子:
上图为一个pcd文件(数据文件)的数据结构,主要由各个chunk(1/2 ,1/4或1/8 Block Size)组成,里面存储压缩后的页数据。
上图为一个pca文件里的数据结构。包括head和addr。head中存储的是相关压缩配置,暂不详细介绍。addr里存储的是chunk的编号,一个addr对应一个页,addr里的chunk编号(一个或多个)就是这个页经过压缩之后存放在数据文件里面的各个chunk的编号。
参考资料: PG讨论邮件:https://www.postgresql.org/message-id/flat/27c4d6cd.b978.172847e9202.Coremai... 基于PG的行表压缩代码仓库:https://github.com/ChenHuajun/postgres/tree/page_compress_14