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

时间:2018-04-16 11:29:40

标签: postgresql storage

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

1 个答案:

答案 0 :(得分:0)

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

PostgreSQL表分为8kB大小的块。每条记录(官方字词是“元组”)都存储在一个区块中。

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

PostgreSQL永远不会更新元组。在UPDATE语句期间,将新元组插入到具有足够可用空间的块中,并将旧标记标记为 如被替换。 This is to implement transaction isolation;对于具有早于更新事务的快照的并发语句,旧元组仍然可见。

旧元组最终被autovacuum background process释放。然后可以通过新元组重用可用空间。