我已阅读有关物理存储的文章“http://rachbelaid.com/introduction-to-postgres-physical-storage/”。但我不明白Postgres如何更新文件中的可变长度记录。 Postgres是否会移动相邻行或创建新行并将旧行标记为已删除?
答案 0 :(得分:0)
您应该阅读the documentation本身以获取可靠的信息。
PostgreSQL表分为8kB大小的块。每条记录(官方字词是“元组”)都存储在一个区块中。
PostgreSQL尝试通过在与表关联的“TOAST表”中存储可变长度数据类型来缩小超过2kB的元组。这种技术可以确保即使是大行也可以存储在一个块中。
PostgreSQL永远不会更新元组。在UPDATE
语句期间,将新元组插入到具有足够可用空间的块中,并将旧标记标记为
如被替换。 This is to implement transaction isolation;对于具有早于更新事务的快照的并发语句,旧元组仍然可见。
旧元组最终被autovacuum background process释放。然后可以通过新元组重用可用空间。