当我们向具有大量数据的现有表添加索引时会发生什么?


Answers:


10

如果使用plain CREATE INDEX,则该表将被锁定以进行写操作而不是读操作。

也可CREATE INDEX CONCURRENTLY用于避免写锁定。

来自PostgreSQL文档CREATE INDEX

当使用该选项时,PostgreSQL将建立索引而不会采取任何防止在表上进行并发插入,更新或删除的锁。而标准索引构建会锁定对表的写入(但不会读取),直到完成为止。使用此选项时需要注意一些注意事项-请参阅同时构建索引

更具体的(像@ypercube评论):

PostgreSQL支持在不锁定写入的情况下建立索引。通过指定的CONCURRENTLY选项来调用此方法CREATE INDEX。使用此选项时,PostgreSQL必须对表进行两次扫描,此外,它还必须等待所有可能使用索引终止的现有事务。因此,与标准索引构建相比,此方法需要更多的总工作量,并且需要花费更长的时间才能完成。但是,由于它允许在建立索引时继续进行正常操作,因此该方法对于在生产环境中添加新索引很有用。

大胆强调我的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.