PostgreSQL 19 TOAST用lz4后会怎样?速度与空间选择
19将TOAST默认方式调整为优先lz4,但升级完成不等于旧长文本立刻全部改压缩。已有值可以保留旧格式,以后需要压缩的新值才受新默认策略影响。
选压缩算法要按业务在意的成本来比较:CPU是否紧张、读取是否频繁、磁盘是否有限。不能仅凭方法更新就决定整体更换。
一、TOAST 是什么?哪些字段会用到?
当字段太大,一页放不下时,数据库会依据类型和存储方式压缩或拆出去存放,长文章、大JSON和二进制内容都可能遇到。这套处理称为TOAST。
它不是整个数据库文件的压缩开关,也不是每个字段都要压缩。数字、短字符串,以及压不动的数据,可能根本没有使用某种 TOAST 压缩方法。
所以,库里主要是短记录的项目,即使默认方式变化,空间占用也可能差不多。不要把默认值调整,直接换算成数据库会缩小多少。
二、lz4 和 pglz 应该怎么比?
lz4 通常更重视压缩和解压速度,但具体能省多少空间,要看内容。重复很多的文本、结构相似的 JSON、已经压缩过的二进制文件,结果可能很不一样。
| 业务情况 | 重点比较 |
|---|---|
| 频繁读取大字段,CPU 较忙 | 解压与整条查询耗时,lz4 是否降低计算负担 |
| 大量写入长文本 | 压缩耗时、写入速度、WAL 与磁盘占用 |
| 长期归档,读取很少 | 真实存储大小、备份大小和维护成本 |
| 字段本来就已压缩 | 是否还能有效压缩,额外开销是否值得 |
比较的对象应该是完整业务操作。如果 SQL 只查 ID,不读取大字段,它可能根本没有触发相同的解压工作,不能拿这个结果证明某种算法更快。
三、先查看当前实际设置
列的 attcompression 可以表明是否指定压缩方式:p 对应 pglz,l 对应 lz4,空值表示按默认设置处理。列设置优先于会话中的默认值。
19 的默认行为还取决于安装程序是否具备 lz4 支持;没有支持时,默认会回到 pglz。不要只根据主版本号推断实际设置。
四、怎样指定某一列使用 lz4?
先在测试库对目标列指定方式:
这条命令修改列策略,不会直接重写整张表。已有值仍可能是 pglz,新写入的值则按新策略处理。同一列里出现多种实际格式,并不一定是异常。
可以对少量样本查看实际压缩方式:
返回 NULL 可能表示该值没有采用压缩,不能直接认定设置失败。样本也应该包含足够长、确实需要压缩的内容。
五、旧数据想改压缩方式,不能只做无效重写
不要假定执行 UPDATE body = body,就会让所有值重新压缩。未改变的大值可能继续复用原来的存储形式;从另一张表 INSERT SELECT,也可能保留原来的压缩数据。
如果确实需要统一转换,应先在隔离环境测试导出恢复等能够按目标设置重新写入值的方法,并检查实际结果。保留列策略、恢复方式和数据核对记录,再计算停机及空间需求。
为了换算法专门重写大表,会增加磁盘读写、WAL和额外空间。如果收益很少,未必值得安排全量转换。
六、实际决策怎么做?
用有代表性的长文本或JSON分别装载到明确指定pglz、lz4的测试表,确认真实格式后,再测大小、装载用时和读取完整大字段的耗时。
lz4若能改善CPU或响应,空间成本又可接受,就可以考虑采用;磁盘紧张时则以真实数据为准。不要仅为跟随默认值而立即重写运行良好的历史数据。
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏