ITPub博客

首页 > 数据库 > PostgreSQL > postgresql create index concurrently过程描述

postgresql create index concurrently过程描述

PostgreSQL 作者:chenfeng 时间:2021-04-06 11:34:31 0 删除 编辑

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、结束索引创建。索引可见。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15498/viewspace-2766634/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
交流MySQL,PolarDB/PolarDB-X,PostgreSQL,MongoDB和Redis技术。

注册时间:2015-12-07

  • 博文量
    784
  • 访问量
    2689195