有一个带有 BATEA 字段的表,其中数据、xml 文件被压缩,以节省空间。也就是说,一个样本,我们将它们解压缩并发布它们。
但是我们了解到,似乎有某种 TOAST 字段类型,您可以以明文形式存储数据,而 postgres 本身会负责它们的压缩。
这是https://www.postgresql.org/docs/9.4/static/storage-toast.html
告诉我它是如何创建的?没找到例子,不知道怎么创建常规的文本列,但是压缩了
CREATE TABLE "table" (
"ID" INTEGER NOT NULL,
"txt" TEXT TOAST ??????? ,
PRIMARY KEY ("ID")
)
TOAST
它不是数据类型。一般来说,事实上,这是一个拐杖。在较低级别,这些行被放置在 8kb 块 - 页中(原则上,不一定是 8kb,这是一个编译时选项 - 但我从未见过它改变)。并且整条数据线的大小不能超过8kb。根本不可能,这是一个硬限制。但是如果用户想要保存更多的东西 - 他可以做到。在这种情况下,数据被透明地分割为用户的部分,并存储在单独的服务toast
表中。一路上,他们可能会尝试压缩——据我所知,那里使用的压缩算法速度很快,而且压缩效果不是很好。这完全自动发生,唯一可用的设置是可以通过以下方式选择4 种策略之一
ALTER TABLE SET STORAGE
:PLAIN
禁止压缩和移除toast
EXTENDED
允许压缩和toast
制表EXTERNAL
禁止压缩,但允许单独存储MAIN
启用压缩,仅在没有其他帮助的情况下将数据与字符串分开存储另外,我注意到没有需要压缩数据或将其放置在 toast 表中的设置。小数据不会被单独压缩或渲染。
据我所知,
toast
所有的变长数据类型都可以取出来:text、varchar、arrays、json、jsonb、xml、hstore等。C 中数据类型的实现知道 的使用toast
,所以我不能说toast
所有可变长度数据类型使用什么,但至少对于大多数 - 肯定。也就是说,如果您使用大于 2kb 的 bytea,则您已经拥有并使用了 toast。本机压缩算法是否会比您当前使用的更紧凑 - 我对此表示怀疑,但您可以通过实验进行检查。