我安装了PostgreSQL 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
);
然后我将我的数据插入到这些表中。
我检查了数据的压缩情况,发现有403行使用了lz4
进行压缩,只有一行用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)