PostgreSQL中的TOAST
toast技术主要用来解决可变长度数据类型的存储问题。
简介
在PostgreSQL中,页面的大小是固定的(通常是8k),而PostgreSQL不允许数据的分页存储,因此当存储一些大字段时,大字段通常会被压缩或者切片称为多行,存到的系统表 (toast)中。
可变类型数据在表中的存储
在可变长度类型中,表中前4个字节(32bit)称为长度字,后边的内容为指针或者数据的实际内容。
toast的长度最多1GB
可变类型的数据在表中的存储:
数据的指针组成:
数据的未压缩的大小
数据的实际存储大小
对应的toast表的oid
toast表中的chunk_id
toast表
当一个表中的数据是可变长度时,系统会自动建一个关联的toast表,并在pg_class.reltoastrelid表中存储对应的关系。真实的数据时被分散到chunk块中进行存储的。在toast表每行都代表一个chunk块,chunk的大小是分页大小的1/4(默认2KB),包含以下内容:
chunk_id:唯一标识
chunk_seq:该chunk块在整体数据中的排序
chunk_data :实际存储的内容
toast的策略及使用
4种toast策略:
ALTER TABLE [表名] ALTER [字段名] SET STORAGE [策略名];
# 修改blog表中content内容的toast策略
ALTER TABLE blog ALTER content SET STORAGE EXTERNA ;
tip(关于压缩):
在chunk块数据在快接近其最大大小时(2040),数据才会被压缩
在11版本后,可以手动修改启动压缩的值
ALTER TABLE [表名] SET {toast_tuple_target=128};
License:
CC BY 4.0