我试图了解PostgreSQL如何在没有写锁定的情况下构建索引concurrently。
有人可以描述PostgreSQL为此而执行的步骤,同时连续写入表格数据吗?
答案 0 :(得分:2)
相关详细信息在源代码注释中。见the comments on validate_index
in src/backend/catalog/index.c
around line 2607:
我们首先插入商品,然后进行并发索引构建 对于索引通过index_create(),标记它不是indisready而不是 indisvalid。然后我们提交我们的交易并开始一个新的交易 我们等待所有可能修改表的事务 终止。
....还有很多,还有很多。基本上“它很复杂”。我将尝试解释它,但我没有详细阅读代码,我不知道代码库的这一部分,因此唯一正确的解释是注释和源代码。< / p>
我的理解是它基于表状态的MVCC快照进行初始构建,并在完成后提交它。然后它等待直到所有事务都能看到(损坏的)索引,此时它们在更改表中的内容时都会更新它。然后,它会比较构建索引时可见的内容与现在可见的内容,并更新索引以反映快照之间的差异。然后它等待确保没有可以在索引处于无效状态时查看索引的事务,标记索引有效,并再次提交。
整个过程在很大程度上依赖于MVCC快照和可见性。与常规索引构建相比,在I / O,CPU和RAM方面相当更昂贵。
DefineIndex
in src/backend/commands/indexcmds.c调用 validate_index
,其中包含有关整个过程的详细信息。