在PostgreSQL中使用“create index concurrently”是否有助于未来插入的行免受锁定?

4

create index concurrently只在表第一次创建时有效,还是对将来插入的记录也有效?

1个回答

7
你误解了concurrently的作用: 它在创建索引时避免对表进行写入访问的锁定。一旦索引被创建,使用concurrently选项和不使用选项创建的索引没有区别。如果插入新行,则索引将使用新值进行更新。插入新行不会“重新构建”整个索引。
创建索引后,无论索引是如何创建的,向表中插入行都不会锁定表。非唯一索引始终允许并发插入到表中。
然而,unique索引将为相同的值阻止并发插入-但不是针对不同的值。

假设今天我的表在生产环境中有10条记录,我添加了create index concurrently on (column_A)从明天开始,数百万条记录将被插入到表中,并且索引将会动态创建。是这样吗?此时,concurrently可以防止写入(插入/更新)期间的锁定。我的理解正确吗? - sofs1
1
@sofs1:不是这样的。一旦索引被创建,concurrently属性就不存在了。当您插入新行时,索引将被更新,而不是“创建”。 - user330315
当使用此选项时,PostgreSQL将在构建索引时不会锁定任何阻止对表进行并发插入、更新或删除的锁定。这是否与您的答案相矛盾? - sofs1
1
@sofs1:这指的是创建索引的过程。我关于锁的评论是针对索引创建后的DML操作。 - user330315
1
使用创建索引命令后插入的新记录,是否会导致并发数据插入/更新,我还是有些困惑。 - sofs1
1
这是另一份很好的文档,介绍了索引创建的各个阶段:https://www.2ndquadrant.com/en/blog/create-index-concurrently。需要注意的是:“当第三遍完成时,索引就已经完全准备好了。现在,所有其他后端都按照通常的HOT规则积极地维护它。”-因此,在索引创建后没有任何区别。 - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接