概述¶
PostgreSQL 是一款功能强大的关系型数据库管理系统,在处理大量数据时,有效节省存储空间是一项重要的优化任务。以下将详细探讨在 PostgreSQL 中如何实现数据的压缩存储以节省空间,并提供相应的解决方案和示例代码。
PostgreSQL 从版本 12 开始支持创建压缩表(COMPRESSED TABLES)。压缩表可以显著减少存储空间的使用,特别是对于包含重复值较多或数据类型较大的列。
在 PG14 之前版本,TOAST 仅支持一个压缩算法 PGLZ(PG 内置算法)。但是其他压缩算法可能比 PGLZ 更快或者有更高的压缩率。PG14 中有了新压缩选项 LZ4 压缩,这是一个以速度著称的无损压缩算法。因此我们可以期望它有助于提高 TOAST 压缩和解压缩的速度。
为了使用 LZ4 压缩特性,在编译时需要指定--with-lz4,并且在操作系统中按照LZ4 库。通过 GUC 参数default_toast_compression可以指定 PG 实例的 TOAST 默认压缩算法。可以在postgresql.conf中配置,也可以通过 SET 命令仅改变当前连接:
postgres=# SET default_toast_compression=lz4;
SET
CREATE TABLE tbl (
id int,
col1 text COMPRESSION pglz,
col2 text COMPRESSION lz4,
col3 text
);
postgres=# \d+ tbl
Table "public.tbl"
Column | Type | … | Storage | Compression | …
-------+---------+---+----------+-------------+ …
id | integer | | plain | |
col1 | text | | extended | pglz |
col2 | text | | extended | lz4 |
col3 | text | | extended | |
Access method: heap
我们使用\d+命令可以看到所有列的压缩算法。如果列不支持或者没有指定压缩算法,那么会在 Compression 列显示空格。
在上面的例子中,id 列不支持压缩算法,col1 列使用 PGLZ,col2 使用 LZ4,col3 没有指定压缩算法,那么它会使用默认的压缩算法。可以通过ALTER TABLE 修改列压缩算法,但需要注意,修改后的算法仅影响执行整个命令后的 insert 数据。