Postgresql TOAST

Postgresql TOAST

TOAST (The Oversized-Attribute Storage Technique,超大尺寸字段存储技术)主要用于存储大字段的值。
PostgreSQL 页面(page)大小是固定的(通常为8KB),且不允许tuples跨多个页面存储。因此不能存储非常大的字段值。为了克服这个限制,大字段值通常被压缩甚至切片成多个物理行存储到TOSAT表,这就是TOAST技术。TOAST对用户来说是透明的。
注:
Postgres的部分类型数据支持TOAST,这是因为有些字段类型是不会产生大字段数据的,完全没必要用到TOAST技术(比如int,float,date,time,boolean等)。
如果设置压缩标志位为1,表示该数据被压缩,使用前必须先解压。如果设置行外存储标志位为1,表示该数据行外存储,此时长度字后面的部分只是一个指针,指向存储实际数据的TOSAT表中的位置。
不论哪种情况,长度字里剩下的30bit的长度值表示数据的实际尺寸,而不是压缩后的尺寸。
TOAST数据

  • 如果表中任何一个字段有TOAST,那么这个表都会自动创建一个关联的TOAST表,OID被存储在pg_class.reltoastrelid里面。行外存储Out-of-line values(可能是压缩后的,如果使用了压缩)将会被分割成多个Chunk块,每个Chunk块约为一个BLOCK的四分之一大小,toast_max_chunk_size(缺省是2KB),每个Chunk作为独立的行存储在TOAST表中。
  • 相比较普通表(MAIN TABLE),TOAST表都有三个额外字段:chunk_id(一个表示特定TOAST值的OID)、chunk_seq(一个序列号,表示存储该块在数值中的位置)、chunk_data(该Chunk的实际数据)。在chunk_id和hunk_seq上有唯一索引,提供对数值的快速查询。

每个字段有四种TOAST的策略:

  1. PLAIN:避免压缩或行外存储。对于那些不能TOAST的数据类型可以选择这个策略。
  2. EXTENDED:允许压缩和行外存储。这是大多数可以TOAST的数据类型的默认策略。首先进压缩,如果行仍然太大,则进行行外存储。
  3. EXTERNA:允许行外存储,但是不允许压缩。因为没有压缩,这让在text类型和bytea类型字段上的子字符串操作更快,原因是这些子字符串操作可以只读取整个数据中需要的部分,而不是整个数据,当然代价是增加了存储空间。
  4. MAIN:只允许压缩,但不允许行外存储。实际上,当行内无法放下时仍然会进行行外存储,但只是在没有办法把数据行变得更小的情况下的最后手段。
    可以通过ALTER TABLE … SET STORAGE改变某个字段系统默认分配的TOAST策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值