3

在 PostgreSQL 中,每次更新元组都会创建新的元组版本。所以在一段时间内可能会有很多版本的相同元组,不同的事务可以看到不同版本的元组(使用可见性规则)

索引在事务完成之前更新。这如何与 SI 一起工作?

那么当一个事务更新元组然后索引条目更新以指向新版本的元组时?

4

1 回答 1

13

由于 PostgreSQL 通过同时在表中保留一行的多个版本来实现 MVCC,它还为单行的不同版本保留多个索引条目(如果索引条目没有被修改,有时可以通过仅堆元组避免这种情况在更新期间并且更新的行与原始版本在同一个表块中)。

可见性信息不存储在索引中,因此要在索引扫描期间找到正确的行版本,必须检查所有这些索引条目的表条目(如果已知索引块仅包含条目,则有时可以避免这种情况每个人都可见;这是仅索引扫描)。

在 autovacuum 期间,旧的索引条目与旧的表条目一起被删除。

于 2017-04-24T08:03:33.363 回答