postgresql - 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 值有一个新的引用?
解决方案
见这里:
在 UPDATE 操作期间,未更改字段的值通常按原样保留;因此,如果行外值均未更改,则对具有行外值的行进行更新不会产生 TOAST 成本。
推荐阅读
- c# - 如何在 C# 中设置 Crystal 报表的数据集
- c# - C# 无法使用 TLS1.2 在 Windows 7/Windows Server 上创建 ssl/tls 安全通道
- android - 处理flutter和google play游戏
- c++ - MFC:我们怎样才能轻松地从 CTreeCtrl 切换到 CTreeView?
- python - 如何使用pypdf2打开pdf文件
- javascript - 选择“无线电按钮”选项时,如何禁用其他Opitons?
- bigdecimal - 无法以大数字作为参数从 web3 调用合约函数
- php - 为什么 bindValue 将字段设置为最后一个值?
- c# - 使用三元运算符的 LINQ 选择查询
- google-cloud-platform - 谷歌 colab 与谷歌云存储数据出口