查看原文
其他

第19期吐槽:从DuckDB导入到PG后膨胀了5倍,把存储销售乐坏了!什么情况?

digoal PostgreSQL码农集散地 2024-07-08

文中参考文档点击阅读原文打开, 同时推荐2个学习环境: 

1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像

2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库

3、PolarDB开源数据库内核、最佳实践等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

关注公众号, 持续发布PostgreSQL、PolarDB、DuckDB等相关文章. 


第19期吐槽:PG 没有block level压缩

1、产品的问题点

  • 一些时序场景数据外部数据文件导入数据库时占用空间膨胀,可能的原因包括,数据库的数据块有一些头信息,行也有头信息占用额外空间;

    或者使用了低于100%的填充率配置使得数据块的空间没有全部占满;

    还有一个重要的原因是外部文件可能是压缩的而数据库没有使用压缩,或者说行级别的main或toast压缩率是很低的。

  • 相比于duckdb parquet, pg的存储空间消耗是其5.3倍. 详细可参考这篇文章的测试: 性能被DuckDB碾压,PG最应该反省哪几方面?

对比列存储压缩, PG占用的空间是DuckDB的5.3倍

PostgreSQL: sf=2 占用 2561 MB

postgres=# show default_toast_compression;
default_toast_compression
---------------------------
pglz -- 支持 lz4, pglz ; toast_threshold = 2K
(1 row)

DuckDB: sf=2 占用 480M

EXPORT DATABASE '/data' (FORMAT PARQUET, COMPRESSION ZSTD,
ROW_GROUP_SIZE 100_000);

parquet 格式:
支持压缩方式: snappy, gzip or zstd
分组大小: row_group_size_bytes = row_group_size * 1024
分组大小: row_group_size 默认 122880

  • PG 没有block level压缩.  

2、问题点背后涉及的技术原理

  • PG 只有行级别压缩, 当1条记录压缩后的长度超过1/4 block size(约2000字节)(由参数 TOAST_TUPLE_THRESHOLD 控制阈值) 时, PG 会将其变长字段类型存储到TOAST切片. 参考信息:

    • 《HOW to Change PostgreSQL's TOAST_TUPLE_THRESHOLD》

    • 《TOAST,The Oversized-Attribute Storage Technique - 暨存储格式main, extended, external, plain介绍》

  • 这种行级别的压缩方式压缩率较低 

3、这个问题将影响哪些行业以及业务场景

  • 对存储的成本较为敏感的业务, 例如IOT, 时序, 冷数据, 冷仓库等.

4、会导致什么问题?

  • 压缩率低, 需要使用更多的存储空间, 导致存储成本较高

5、业务上应该如何避免这个坑

  • 更换产品,

  • 使用FDW, 将数据存储在外部, 例如OSS_FDW, duckdb_fdw将数据存储在OSS对象存储内, 使用外部廉价、高压缩率存储格式(如parquet). 参考信息:

    • 《PostgreSQL 牛逼的分析型功能 - 列存储、向量计算 FDW - DuckDB_fdw - 无数据库服务式本地lib库+本地存储》

  • 使用列存储、瓦片存储插件. 参考信息: 

    • 《PostgreSQL VOPS 向量计算 + DBLINK异步并行 - 单实例 10亿 聚合计算跑进2秒》

    • 《PostgreSQL 向量化执行插件(瓦片式实现-vops) 10x提速OLAP》

    • 《hydra, 一款基于PostgreSQL的开源HTAP数据库. 支持列存,向量化,物化,冷热分离存储,cloud 等特性》

    • 《PostgreSQL 收费列存储插件 - Swarm64》

    • 《PostgreSQL zedstore 行 列 混合存储使用》

6、业务上避免这个坑牺牲了什么, 会引入什么新的问题

  • 管理成本增加

  • 使用oss_fdw外部存储, 不支持索引, 查询速度更慢. DuckDB_fdw相对来说比较好, 因为parquet有切片及每个切片都有meta信息, 所以不需要全部扫描.

7、数据库未来产品迭代如何修复这个坑

  • 内核层支持BLOCK级别的压缩, 提升heap表行存储的压缩率. 

  • 使用压缩效率、压缩率更高的算法, 

  • 使用列存储|瓦片存储作为官方存储的插件, 存储同类的数据, 比"行+块级别压缩"率更高. 

本期彩蛋-招商中...


文章中的参考文档请点击阅读原文获得. 


欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:



继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存