跳转至

概述

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 数据。