PostgreSQL之TOAST
TOAST的全称是The Oversized-Attribute Storae Technique, 即超尺寸字段存储技术;每次看到,恰好也想到面包片,而它的总体想法也就是把一个超大尺寸的列(主要是变长类型的)进行尽可能地切片。
这个图给出了TAOST技术在磁盘存储上的整体信息,关键信息点如下:
- toast只是针对一条元组中的某个超长的字段进行操作的,操作成功后这个字段存储了一个toast指针类型的数据,由它来寻找切片后的数据存储在哪里,怎么样将它们寻找完整;
- toast元组存储在额外的表中,属于一个字段的元组有着相同的chunk id,同时又有另外一个chunk seq标识将各个片断标识并有序联系起来,这样就可以还原为一条完整的可访问字段的数据;
- 一个toast元组其结构与常规元组无异,其大小不会超过面的1/4,一个页中基本来说有4个这样的元组即可填充满;
TOAST的存储策略
- PLAIN, 平面存储,避免压缩或者线外存储。对那些不能toast的数据类型才有可能,基本定长数据类型都属于这种;
- EXTENDED, 允许压缩和线外存储,这是大多数据可以toast的数据类型的默认策略。首先,会企图对数据进行压缩后线内存储, 如果元组仍然太大,则进行线外存储;
- EXTERNAL, 允许线外存储,但是不允许压缩。这种方式可能会使得像text/bytea类型的子串操作操作更快,但是代价是增加了存储空间。
- MAIN,允许线内压缩,但不允许线外压缩。实际上,在这样的数据上仍然可能会进行线外存储,只有在没有办法把数据变得更小的情况下会采取这样的手段。
varlen数据的存储
变长的存储有两种格式,一种是1字节头的,一种是4字节头的。以big endian来讲,
- 10000000 1字节长度,不对齐,用于存储toast指针
- 1xxxxxxx 1字节长度,不对齐,非压缩数据,最大126字节的数据
- 00xxxxxx 4字节长度,对齐,非压缩的数据
- 01xxxxxx 4字节长度,对齐,已压缩的数据
第1种恰好对应的是taost指针数据的存储格式。第2种是最常见的长度在127之内的字符串数据的存储格式。剩下的两种情况是4字节存储格式,只是一种是压缩数据的,另一种是非压缩的。
对于有些数据类型,是不允许padding的。无论是在磁盘上的存储,还是在执行引擎过程中的运算,都必须是4字节的头格式。这一部分数据在实施数据的压缩过程中是需要注意的。