Har*_*ren 11 postgresql index concurrency locking
我有一个包含大约 1500 万条记录的表。现在我需要向表中添加一个索引。
添加索引需要一些时间来更新表中的每个条目。
我很困惑添加索引是否会导致停机。
如果是,那么我怎样才能克服停机时间?
Fab*_*oni 10
使用 plain CREATE INDEX
,表将被锁定以进行写入而不是读取。
也CREATE INDEX CONCURRENTLY
用于避免写锁。
使用此选项时,PostgreSQL 将在不使用任何锁的情况下构建索引,以防止在表上并发插入、更新或删除;而标准索引构建会锁定表上的写入(但不会读取),直到完成为止。使用此选项时需要注意几个注意事项 - 请参阅同时构建索引。
而更具体的(像@ypercube评论):
PostgreSQL 支持在不锁定写入的情况下构建索引。通过指定 的
CONCURRENTLY
选项来调用此方法CREATE INDEX
。使用此选项时,PostgreSQL 必须对表执行两次扫描,此外它还必须等待所有可能使用索引的现有事务终止。因此,此方法需要比标准索引构建更多的总工作,并且需要更长的时间才能完成。但是,由于它允许在构建索引时继续正常操作,因此此方法对于在生产环境中添加新索引很有用。
大胆强调我的。