我安装了一个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
);然后我把我的数据插入到这些表中。我检查了数据被压缩的位置,得到了使用lz4压缩了403行,只有一行使用了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)对我来说,奇怪的是这三张桌子的大小是一样的!好的,关于未压缩表和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)数据库中使用的默认压缩是pglz,也许这个信息很重要.
postgres=# SHOW default_toast_compression ;
default_toast_compression
---------------------------
pglz
(1 row)发布于 2022-03-04 20:11:40
你没说是什么样的音频文件。大多数音频文件格式已经压缩,不会进一步压缩。base64编码它们确实意味着它们应该压缩一点点,以压缩它们所导致的扩展。没有Huffman编码的LZ在压缩这种扩展方面尤其糟糕。这就是通过查看表的大小所看到的:压缩是徒劳的。
PostgreSQL使用的压缩实现检查是否无效,并放弃压缩看起来不太可压缩的东西。这就是你在pg_column_compression()上看到的。
https://stackoverflow.com/questions/71350563
复制相似问题