postgresql create index concurrently过程描述

来源:这里教程网 时间:2026-03-14 20:15:14 作者:

PostgreSQL支持在不锁定写入的情况下建立索引。通过指定的concurrently选项来调用此方法create index。使用 此选项时,PostgreSQL必须对表进行两次扫描,此外,它还必须等待所有可能修改或使用索引终止的现有事务。 因此,此方法比标准索引构建需要更多的总工作量,并且需要花费更长的时间才能完成。但是,由于它允许在建立索引的同时 继续进行正常操作,因此该方法对于在生产环境中添加新索引很有用。当然,索引创建所带来的 额外CPU和I / O负载可能会减慢其他操作的速度。 在并发索引构建中,实际上是通过一个事务将索引输入到系统目录中,然后在另外两个事务中进行两次表扫描。在每个表扫描 之前,索引构建必须等待修改该表的现有事务终止。在第二次扫描之后,索引构建必须等待在第二次 扫描之前终止具有快照的所有事务,如果涉及的索引是部分索引或其他索引,则包括在其他表上的并发索引构建的任何阶段 使用的事务。具有不是简单列引用的列。然后,最后可以将索引标记为可以使用了, 并且CREATE INDEX命令终止。但是,即使那样,索引也可能无法立即用于查询:在最坏的情况下,只要存在早于索引构建 开始的事务,就不能使用该索引。 使用create index concurrently创建索引,主要分为三个阶段,扫描两次TABLE。 create index concurrently idx_b_2 on b (id);     阶段如下: 1、开启事务1,拿到当前snapshot1。 2、扫描B表前,等待所有修改过B表(写入、删除、更新)的事务结束。 3、扫描B表,并建立索引。 4、结束事务1。 5、开启事务2,拿到当前snapshot2。 6、再次扫描B表前,等待所有修改过B表(写入、删除、更新)的事务结束。 7、在snapshot2之后启动的事务对B表执行的DML,会修改这个idx_b_2的索引。 8、再次扫描B表,更新索引。(从TUPLE中可以拿到版本号,在snapshot1到snapshot2之间变更的记录,将其合并到索引) 9、上一步更新索引结束后,等待事务2之前开启的持有snapshot的事务结束。 10、结束索引创建。索引可见。

相关推荐