PostgreSQL TOAST不压缩值

时间:2019-02-25 21:28:32

标签: postgresql

我正在做一些测试,以检查将加密数据存储在PostgreSQL数据库中的最佳方法。

现在,我已将文件内容存储在text表中。我100%确定此数据已由TOAST https://www.postgresql.org/docs/9.3/storage-toast.html压缩 我发现的-这不是真的。我的所有“文件”或什至是普通文本(用1M行随机1000个字符的文本进行检查)都没有压缩。 我尝试手动SET STORAGE EXTENDED,但这没用。

实验:

  • 使用随机文本创建文件。 1行= 1000个字符的文本。 文件大小:〜1GB
  • 从文件1行= 1行插入数据。 数据库大小:〜1.1GB (Toast 0或null,表1.1GB)

(对TEXT,TEXT(1001)和VARCHAR(1001)进行了检查。唯一的区别是varchar表的Toast大小为null)

使用以下网站的查询进行测量:https://wiki.postgresql.org/wiki/Disk_Usage

我的问题是:为什么默认情况下,Postgres不压缩长文本,如手册(https://www.postgresql.org/docs/9.3/storage-toast.html)所述,我应该怎么做才能使它工作?

1 个答案:

答案 0 :(得分:3)

Quote from the manual

  

仅当要存储在表中的行值大于TOAST_TUPLE_THRESHOLD字节(通常为2 kB)时,才会触发TOAST管理代码。

对于最大长度为1000个字符的列(除非您使用的是真正的UTF-8字符,否则为1KB),您不会超过2KB的TOAST阈值,因此不会压缩数据。您需要使用多个列,或者在单个列中使用更大的值