1.Toast简介:
Toast是超长字段在PG的一个存储方式,对于用户来说不用关注这一技术的实现,完全是透明的,它会将大字段值压缩或分散为多个物理行来存储,与Oracle的CLOB,BLOB类似。
2.Toast的存储方式:
1.不是所有的数据类型都支持toast,如:date,time,boolean等不支持toast,支持toast的数据类型应当是可变长度的。
2.表中任意一个字段有toast,这个表都会有一个相关联的toast表,OID被存储在pg_class.reltoastrelid里面。
3.超出的数值会被分割成chunks,并且最多toast_max_chunk_size个byte。
4.当存储的列长度超过toast_tuple_threshold(通常是2KB),就会触发toast存储。
5.toast会压缩字段。
3.Toast的4中策略
4.Toast表额外的三个字段
5.实例
(1)创建一个表,查看该表的结构
(2)更改表的存储方式
表都会有一个相关联的toast表,如下:
这个表的名字是pg_toast_16504.。在pg_toast模式下可以查看
6.Toast表计算
查看新生成的toast表:
此时toast表没有存储空间,证明没有触发toast存储。因为此似乎remark列值长度小于2KB,所以不会触发toast存储。
此时查看列的长度
7.Toast表的优点
8.Toast表的成本统计
查看t2表(没有触发toast)的存储空间大小:
共10672KB
查看t3表(触发toast)的存储空间大小:
共1600KB左右
成本分析,不会访问toast表的成本,只会访问基表。
所以,如果表不访问toast大对象的列,toast表有优势,如果访问了toast列,例如select * 则最好不使用toast,可以把存储方式设置伟Main,不允许行外存储。