Postgres如何更新堆文件中的可变长度记录

How does Postgres update a variable length record in the heap file

我已阅读有关物理存储的文章“http://rachbelaid.com/introduction-to-postgres-physical-storage/”。但是我不明白 Postgres 如何更新文件中的可变长度记录。 Postgres 是移动相邻行还是创建新行并将旧行标记为已删除?

您应该阅读 the documentation 本身以获得可靠信息。

PostgreSQL tables 被分成 8kB 大小的块。每条记录(官方说法是“元组”)存储在一个块中。

PostgreSQL 尝试通过在与 table 关联的“TOAST table”中离线存储可变长度数据类型来缩小超过 2kB 的元组。这种技术确保即使是大行也可以存储在单个块中。

PostgreSQL 从不更新元组。在 UPDATE 语句期间,一个新的元组被插入到一个有足够空闲 space 的块中,旧的元组被标记 作为更换。 This is to implement transaction isolation;旧元组对于具有早于更新事务的快照的并发语句仍然可见。

旧元组最终被 autovacuum background process 释放。空闲的 space 可以被新的元组重用。