大家好。
      我和一个伙伴参考PG社区上陈华军基于行表压缩的讨论,参考和移植代码、适配openGauss支持行表压缩功能。现在我附上相应的设计文档和开发分支,希望对这块有兴趣的社区伙伴可以一起来研究探讨和完善。目前该方案在只读场景可以达到接近20%的压缩效果,常用读写场景可以基本达到70%左右的压缩效果。

设计文档:https://gitee.com/wuyuechuan/openGauss-server/blob/page_compress/%E8%A1%8C%E5%AD%98%E8%A1%A8%E5%8E%8B%E7%BC%A9%E7%89%B9%E6%80%A7%E8%AE%BE%E8%AE%A1%E8%AF%B4%E6%98%8E%E4%B9%A6-0413.docx
代码仓库: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/41/8

      地址文件(扩展名.pca)中存储每个压缩页在数据文件中对应的chunk编号数组。

举个例子:

上图为一个pcd文件(数据文件)的数据结构,主要由各个chunk1/2 ,1/41/8 Block Size)组成,里面存储压缩后的页数据。

上图为一个pca文件里的数据结构。包括headaddrhead中存储的是相关压缩配置,暂不详细介绍。addr里存储的是chunk的编号,一个addr对应一个页,addr里的chunk编号(一个或多个)就是这个页经过压缩之后存放在数据文件里面的各个chunk的编号。



参考资料:
PG讨论邮件:https://www.postgresql.org/message-id/flat/27c4d6cd.b978.172847e9202.Coremail.chjischj%40163.com#321d64e9b24f262d6e6a11c1f44b5616
基于PG的行表压缩代码仓库:https://github.com/ChenHuajun/postgres/tree/page_compress_14