我有一个Postgres表,它包含许多索引,其中一些需要删除,因为它们是未使用的。要在不阻塞表的情况下做到这一点,我需要使用DROP INDEX CONCURRENTLY。我总共有10个索引要删除,由于我的迁移系统的设置,它必须对每个迁移进行一个完整的部署,这是一个大约45分钟的过程。理想情况下,我不希望在一个单独的迁移中执行每一个下降,但是仔细查看文档,我无法找到一个明确的声明,说明在同一张表上运行多个DROP INDEX CONCURRENTLYs是否安全。在文献资料 for CREATE INDEX CONCURRENTLY中有一个注释:
常规索引生成允许同一表上的其他常规索引生成同时发生,但一次只能在一个表上生成一个并发索引。
在文献资料 for DROP INDEX CONCURRENTLY中,我没有看到类似的注释。同时在同一张表上运行多个DROP INDEX CONCURRENTLY's是否安全?同样值得注意的是,一些指数位于同一列。同时删除这些指数是否安全?
发布于 2022-11-15 20:34:22
我的快速实验发现,您可以成功地同时运行多个DROP INDEX CONCURRENTLY语句(无论如何在PG14上)。被删除的索引被标记为无效,因此没有新的查询使用它们,然后它在完成删除之前等待出任何锁。一次只有一个DROP处于活动状态,因此不存在冲突的可能性。
即使索引使用的是相同的列,它们也不相互依赖。如果是这样的话,就必须按特定的顺序予以删除。
CREATE INDEX更不可靠,因为在处理过程中必须跟踪表的更新,因此是一次一次的限制。在删除索引时没有这样的问题。
对于记录,非并发DROP INDEX允许您一次指定多个索引以删除,而DROP INDEX CONCURRENTLY只允许每个语句一个索引。
https://dba.stackexchange.com/questions/319720
复制相似问题