首页 > 解决方案 > TOAST 在 MVCC Postgres 中的行为方式

问题描述

美好的一天,我正在阅读关于 TOAST 的 Postgres 文档,但我没有找到任何关于 TOAST 如何在 MVCC 方面工作的信息。根据 postgres 的文档

仅当要存储在表中的行值大于 TOAST_TUPLE_THRESHOLD 字节(通常为 2 kB)时,才会触发 TOAST 管理代码。

据我了解,如果字段足够大并且具有可变长度,那么 postgres 不会将此字段直接存储在元组块中,而是存储对包含该字段的不同表(文件)的引用,其中包含 chunk_id 和 sequence_id。但是,MVCC 呢?假设我有一张桌子user(data jsonb , id int PK,name varchar(255))。通常当更新行时,将创建新行,xmin 等于当前事务。假设 jsonb 字段在 TOAST 表中并且该字段未更新,postgres 会为更新的行创建一个新的 TOAST 实例,还是新行将对现有的 TOAST 值有一个新的引用?

标签: postgresqlmvcc

解决方案


这里

在 UPDATE 操作期间,未更改字段的值通常按原样保留;因此,如果行外值均未更改,则对具有行外值的行进行更新不会产生 TOAST 成本。


推荐阅读