PostgreSQL索引如何处理MVCC

PostgreSQL索引如何处理MVCC,postgresql,indexing,mvcc,Postgresql,Indexing,Mvcc,在PostgreSQL中,元组的每次更新都会创建新的元组版本。因此,在一段时间内,同一个元组可以有很多版本,不同的事务可以看到不同版本的元组(使用可见性规则) 在事务完成之前更新索引。这是如何与SI一起工作的 因此,当一个事务更新元组,然后更新索引项以指向元组的新版本时?由于PostgreSQL通过同时在表中保留一行的多个版本来实现MVCC,因此它还为一行的不同版本保留多个索引项(有时,如果在更新期间未修改索引项,并且更新的行与原始版本位于同一个表块中,则使用仅堆元组可以避免这种情况) 可见性信

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

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


因此,当一个事务更新元组,然后更新索引项以指向元组的新版本时?

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

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


自动抽真空期间,旧索引项将与旧表项一起删除。

感谢您的解释!