TOAST 是“The Oversized-Attribute Storage Technique”的缩写,主要用于存储一个大字段的值。
PostgreSQL采用固定页面大小(通常是8Kb,不象oracle在运行期间有多种选择),元组不能跨越多个页面,无法实现“大字段值“的直接存储。TOAST 提供了解决方法,允许大的字段值被压缩或分裂为多个物理行。
postgresql 只为部分数据类型支提供 TOAST 支持,数据类型必须是变长(varlena)的类型。前 32 位存储着以字节记的数值总长度(包括长度本身)。
长度字的高 2 bit 位是标志位,用于标识压缩与行外存储
一个表示该数值采用行外存储,此时只是存储着一个指针,该指针指向其他的地方。另外30个位表示数据的实际尺寸。
一个表示该数值被压缩,使用前必须先解压缩;
后面 30 bit 是长度值:因此“大字段“的逻辑长度被限制在了1GB(2^30-1)字节内。
如果一个表中有任何一个字段是可以 TOAST 的,那么 PostgreSQL 会自动为该表建一个相关联的 TOAST 表,其 OID 存储在表 pg_class.reltoastrelid 记录里,行外的内容保存在 TOAST 表里
行外数据被分裂成(如果压缩过,以压缩后为参考)最多TOAST_MAX_CHUNK_SIZE(这个数值略小于BLCKSZ/4,或者缺省 2K字节)字节的块,每个块都作为独立的行在 TOAST 表里为所属表存储。每个 TOAST 表都有字段 chunk_id,chunk_seq 和 chunk_data。在 chunk_id 和 chunk_seq 上有一个唯一索引,提供对数值的快速检索。
只有表中存储超过 BLCKSZ/4 字节(通常是2Kb)的行才会触发,对字段进行压缩和行外存储,直到小于BLCKSZ/4字节,或者无法得到更好的结果的时候才停止。UPDATE操作过程中,未改变的字段的数值通常原样保存;因此UPDATE行外存储的记录时,如果行外数据值没有变化,将不会带来 TOAST 开销存在。
TOAST 代码识别四种不同的存储可TOAST字段的策略:
PLAIN避免压缩或者行外存储。只对那些非TOAST数据类型才有效。
EXTENDED允许压缩和行外存储。大多数TOAST数据类型的缺省值。首先进行压缩,如果行仍然太大,则进行行外存储。
EXTERNAL允许行外存储,不许压缩。使用 EXTERNAL将令那些在 text 和 bytea 字段上的子字串操作更快(代价是增加了存储空间),因此这些操作是经过优化的:如果行外数据没有压缩,那么它们只抓取需要的部分。
MAIN允许压缩,不允许行外存储。当数据值压缩过后仍然太大将会采用行外存储。每个可以 TOAST 的数据类型都为该数据类型的字段声明一个缺省策略,但是特定表的字段的存储策略可以用ALTER TABLE SET STORAGE修改。
相对直接的存储方式来说,数据经过 TOAST 方式后,单个或者连续数据块中能够存储更多的数据值,对于访问非“大字段”时,能够大量减少扫描块数或者物理IO 次数;
对于极少访问的含“大字段”记录,经过手动修改存储属性,采用 TOAST 方式,即便值小于 2K 的情况下同样能够带来很好的效果。
针对系统数据访问特定,灵活的采用 TOAST 存储策略总能够为系统带来性能的提升。
fillfactor 为表的填充因子,toast.fillfactor 是这个表中 TOAST 表的填充因子。填充因子是一个从 10 到 100 的整数,表示在插入数据时,在一个数据块中填充百分之多少的空间后就不再填充了,另一部分空间预留了更新时使用。
HOT 是 “Heap-Only Tuple” 的缩写。
pg 在 8.3 中,加入了 hot 技术。使用 hot 技术后,若所有索引属性都没有被修改(索引键是否修改是在执行时逐行判断的,因此如果一条update修改了某属性,但前后值相同则认为没有修改),且新版本与原来版本存在一个页面上则不会产生新的索引记录,因此这些记录被称为 hot(heap only tuple)。
hot 会被打上 heap_only_tuple 标志,而 hot的上一个版本会被打上heap_hot_updated 标志,然后顺着版本链向后找,直到遇到 hot 为止。限制 heap_only_tuple 版本与 hot 在同一页面的目的是为了通过版本链向后找时不产生额外的 io 操作从而影响性能。因此,hot 技术消除了拥有完全相同键值的索引记录,减少了索引的大小。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31490526/viewspace-2741945/,如需转载,请注明出处,否则将追究法律责任。
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员