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)
你没有说是什么类型的音频文件。大多数音频文件格式已经被压缩,并且不会进一步压缩。对它们进行 base64 编码确实意味着它们应该压缩一点,以压缩因编码而引起的扩展。没有霍夫曼编码的 LZ 在压缩这种类型的扩展方面特别糟糕。通过查看表的大小,您会看到以下结果:压缩是徒劳的。
PostgreSQL 使用的压缩实现会检查无效性并放弃压缩看起来不太可压缩的内容。这就是你所看到的pg_column_compression()。
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |