PostgreSQL使用MVCC技术进行数据库并发控制,为每次写入创建一个新版本的项,然后通过可见性rules.The访问该版本。问题是btree索引如何实现多个版本控制?当添加新的btree节点并拆分该树时,原始btree结构将被更改。此时,PGSQL是如何处理的?有人能告诉我吗?
发布于 2020-02-23 16:44:37
在PostgreSQL中,索引不实现MVCC。索引包含可能对任何人都感兴趣的每一行,从插入但尚未提交的行到完全过时但尚未空出的行。您必须访问表本身,以查看该行是否对您感兴趣。
在这方面有一些优化。在仅索引扫描中,有时可以查阅表的可见性映射,而不是表本身的主要部分。另外,如果查询在索引中查找一行,然后转到表中,发现该行对于所有用途来说都是过时的,那么当它返回到索引时,它可以在索引中标记它死掉,这样以后的查询就不需要访问表了。
当新的btree节点被添加并且树被分割时,原始的btree结构将被改变。此时,PGSQL是如何处理的?有人能告诉我吗?
我不认为这是一个堆栈溢出类型的问题。所有细节的最佳参考是源代码和源代码注释。也许您只是想知道,如果事务回滚会发生什么。页面拆分保持不变,插入的元组一直保持到真空移除为止(此时页面拆分仍然保持不变)。
在崩溃的情况下,描述拆分的WAL记录要么会被回放,要么不会播放。由于被拆分所污染的页面无法写入,直到描述拆分的WAL记录被刷新到磁盘(在此之前,它们在shared_buffers中被保护),系统将以任何方式处于一致状态。
https://stackoverflow.com/questions/60361958
复制相似问题