PostgreSql 14 lz4 压缩不起作用?

Dar*_*ria 5 compression postgresql lz4

我安装了 PostgrSql 14,我想压缩一些数据以节省一些磁盘空间。数据是音频文件 (1kb - 5mb),转换为 Base64 字符串。我创建了3张表:

CREATE TABLE t_uncompressed (
    file_name VARCHAR(50) NOT NULL PRIMARY KEY,
    file_size BIGINT,
    raw_data       TEXT
);


CREATE TABLE t_lz4 (
    file_name VARCHAR(50) NOT NULL PRIMARY KEY,
    file_size BIGINT,
    raw_data       TEXT COMPRESSION lz4
);


CREATE TABLE t_pglz (
    file_name VARCHAR(50) NOT NULL PRIMARY KEY,
    file_size BIGINT,
    raw_data       TEXT COMPRESSION pglz
);
Run Code Online (Sandbox Code Playgroud)

然后我将数据插入到这些表中。我检查了数据被压缩的位置,发现 403 行被压缩lz4,只有 1 行被压缩pglz

SELECT count(*) total, 
count(*) FILTER ( WHERE pg_column_compression(raw_data) NOTNULL) compressed, 
'lz4' compr_type
    FROM t_lz4
UNION
SELECT count(*) total, 
count(*) FILTER ( WHERE pg_column_compression(raw_data) NOTNULL) compressed, 
'pglz' compr_type
    FROM t_pglz;

 total | compressed | compr_type 
-------+------------+------------
   738 |          1 | pglz
   738 |        403 | lz4
(2 rows)
Run Code Online (Sandbox Code Playgroud)

对我来说,奇怪的是所有三张桌子的大小都是相同的!好的,关于未压缩表和 pglz 表,但是为什么 _lz4 表具有相同的大小

我以这种方式获取表格尺寸:

SELECT schemaname || '.' || tablename full_tname
    , pg_size_pretty(pg_total_relation_size('"' || schemaname || '"."' || tablename || '"')) total_usage
    , pg_size_pretty(pg_relation_size('"' || schemaname || '"."' || tablename || '"')) data_size
    , pg_size_pretty((pg_total_relation_size('"' || schemaname || '"."' || tablename || '"') -
                      pg_relation_size('"' || schemaname || '"."' || tablename || '"') -
                      pg_indexes_size('"' || schemaname || '"."' || tablename || '"')))
    AS TOAST
    FROM pg_catalog.pg_tables
    WHERE tablename ~ 't_';

  full_tname         | total_usage | data_size | toast  
---------------------+-------------+-----------+--------
 t_lz4               | 338 MB      | 80 kB     | 338 MB
 t_pglz              | 338 MB      | 80 kB     | 338 MB
 t_uncompressed      | 338 MB      | 80 kB     | 338 MB
 (3 rows)
Run Code Online (Sandbox Code Playgroud)

数据库中使用的默认压缩是 pglz,也许这个信息很重要......

postgres=# SHOW default_toast_compression ;
 default_toast_compression 
---------------------------
 pglz
(1 row)
Run Code Online (Sandbox Code Playgroud)

jja*_*nes 2

你没有说是什么类型的音频文件。大多数音频文件格式已经被压缩,并且不会进一步压缩。对它们进行 base64 编码确实意味着它们应该压缩一点,以压缩因编码而引起的扩展。没有霍夫曼编码的 LZ 在压缩这种类型的扩展方面特别糟糕。通过查看表的大小,您会看到以下结果:压缩是徒劳的。

PostgreSQL 使用的压缩实现会检查无效性并放弃压缩看起来不太可压缩的内容。这就是你所看到的pg_column_compression()