簡體   English   中英

PostgreSql 14 lz4 壓縮不起作用?

[英]PostgreSql 14 lz4 compression not working?

我安裝了 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
);

然后我將我的數據插入到這些表中。 我檢查了壓縮數據的位置,發現 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)

你沒有說什么樣的音頻文件。 大多數音頻文件格式已經壓縮,不會進一步壓縮。 base64 對它們進行編碼確實意味着它們應該壓縮一點,以壓縮由編碼它們引起的擴展。 沒有哈夫曼編碼的 LZ 在壓縮這種擴展方面特別糟糕。 這是您通過查看表的大小所看到的:壓縮是徒勞的。

PostgreSQL 使用的壓縮實現檢查無用性並放棄壓縮看起來不太可壓縮的東西。 這就是您在pg_column_compression()中看到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM