详情

首页手游攻略 PostgreSQL 19 TOAST用lz4后会怎样?速度与空间选择

PostgreSQL 19 TOAST用lz4后会怎样?速度与空间选择

佚名 2026-11-02 12:00:02

19将TOAST默认方式调整为优先lz4,但升级完成不等于旧长文本立刻全部改压缩。已有值可以保留旧格式,以后需要压缩的新值才受新默认策略影响。

选压缩算法要按业务在意的成本来比较:CPU是否紧张、读取是否频繁、磁盘是否有限。不能仅凭方法更新就决定整体更换。

一、TOAST 是什么?哪些字段会用到?

当字段太大,一页放不下时,数据库会依据类型和存储方式压缩或拆出去存放,长文章、大JSON和二进制内容都可能遇到。这套处理称为TOAST。

它不是整个数据库文件的压缩开关,也不是每个字段都要压缩。数字、短字符串,以及压不动的数据,可能根本没有使用某种 TOAST 压缩方法。

所以,库里主要是短记录的项目,即使默认方式变化,空间占用也可能差不多。不要把默认值调整,直接换算成数据库会缩小多少。

二、lz4 和 pglz 应该怎么比?

lz4 通常更重视压缩和解压速度,但具体能省多少空间,要看内容。重复很多的文本、结构相似的 JSON、已经压缩过的二进制文件,结果可能很不一样。

业务情况重点比较
频繁读取大字段,CPU 较忙解压与整条查询耗时,lz4 是否降低计算负担
大量写入长文本压缩耗时、写入速度、WAL 与磁盘占用
长期归档,读取很少真实存储大小、备份大小和维护成本
字段本来就已压缩是否还能有效压缩,额外开销是否值得

比较的对象应该是完整业务操作。如果 SQL 只查 ID,不读取大字段,它可能根本没有触发相同的解压工作,不能拿这个结果证明某种算法更快。

三、先查看当前实际设置

SHOW default_toast_compression;SELECT attname, attcompressionFROM pg_attributeWHERE attrelid = 'public.documents'::regclass AND attnum > 0 AND NOT attisdropped;

列的 attcompression 可以表明是否指定压缩方式:p 对应 pglz,l 对应 lz4,空值表示按默认设置处理。列设置优先于会话中的默认值。

19 的默认行为还取决于安装程序是否具备 lz4 支持;没有支持时,默认会回到 pglz。不要只根据主版本号推断实际设置。

四、怎样指定某一列使用 lz4?

先在测试库对目标列指定方式:

ALTER TABLE public.documentsALTER COLUMN body SET COMPRESSION lz4;

这条命令修改列策略,不会直接重写整张表。已有值仍可能是 pglz,新写入的值则按新策略处理。同一列里出现多种实际格式,并不一定是异常。

可以对少量样本查看实际压缩方式:

SELECT id, pg_column_compression(body) AS compressionFROM public.documentsLIMIT 20;

返回 NULL 可能表示该值没有采用压缩,不能直接认定设置失败。样本也应该包含足够长、确实需要压缩的内容。

五、旧数据想改压缩方式,不能只做无效重写

不要假定执行 UPDATE body = body,就会让所有值重新压缩。未改变的大值可能继续复用原来的存储形式;从另一张表 INSERT SELECT,也可能保留原来的压缩数据。

如果确实需要统一转换,应先在隔离环境测试导出恢复等能够按目标设置重新写入值的方法,并检查实际结果。保留列策略、恢复方式和数据核对记录,再计算停机及空间需求。

为了换算法专门重写大表,会增加磁盘读写、WAL和额外空间。如果收益很少,未必值得安排全量转换。

六、实际决策怎么做?

用有代表性的长文本或JSON分别装载到明确指定pglz、lz4的测试表,确认真实格式后,再测大小、装载用时和读取完整大字段的耗时。

lz4若能改善CPU或响应,空间成本又可接受,就可以考虑采用;磁盘紧张时则以真实数据为准。不要仅为跟随默认值而立即重写运行良好的历史数据。

点击查看更多
推荐专题
热门阅读