【问题标题】:In Postgres, why does dropping an index lock the table?在 Postgres 中,为什么删除索引会锁定表?
【发布时间】:2023-02-16 18:42:43
【问题描述】:

postgres 中的 CREATE/DROP INDEX 具有“并发”选项,可用于使 CREATE/DROP 操作不锁定数据库。

https://www.postgresql.org/docs/current/sql-dropindex.html

这让我想知道,为什么定期删除索引需要锁定它索引的表?

我认为它与“CASCADE”或无法在事务中执行 ACID 有关,因为这些是丢失的功能,但我不确定究竟是什么阻止了它。

【问题讨论】:

  • 它不锁定“数据库”,它只锁定表。任何 DDL 语句都需要锁定表以防止其他 DDL 或 DML。但由于删除通常是一个非常快速的操作,所以这不是什么大问题
  • 更新标题以表示感谢。你对快速下降有什么参考吗?当我想把它作为一个选项呈现给同事时,我会很有用
  • 索引基本上是一个查找表,用于索引任何内容。它锁定表以防止某些需要索引的查询进行查找并使索引在查询期间消失。这可能会导致损坏的结果。
  • @AdrianKlaver 如果您将此作为答案发布,我可以将其标记为已接受的答案

标签: postgresql


【解决方案1】:

当您在 PostgreSQL 中删除索引时,数据库需要锁定表以确保在删除索引时没有其他事务修改表。这是因为索引用于维护表中数据的完整性,如果在删除索引时允许其他事务修改表,可能会导致数据不一致等问题。

在索引删除操作期间锁定表可确保在操作完成之前暂时阻止对表的任何更改,这有助于维护数据的完整性。这种锁定行为对于防止其他事务在修改表时访问该表是必要的。

但是,锁定表可能会导致等待释放锁的其他事务出现性能问题。对于大型表或复杂索引尤其如此,其中删除操作可能会花费大量时间。为了缓解这个问题,PostgreSQL 提供了一个 DROP INDEX CONCURRENTLY 命令,它允许您通过创建新索引和跟踪表修改(如 OP 正确提到的那样)来删除索引而不锁定表。

有趣的是评论以下内容同时删除索引:

  • PostgreSQL 创建一个具有不同名称的新索引,然后使用这个新索引来捕获在删除操作期间对表发生的任何修改。
  • 同时删除索引可能是一项资源密集型操作。
  • 并发索引删除会导致磁盘空间使用量增加。

你可以做的一件额外的事情来加快这个过程是增加维护工作内存设置:PostgreSQL 使用 maintenance_work_mem 设置来控制它可用于索引删除等维护操作的内存量。通过允许 PostgreSQL 为删除操作分配更多内存,增加此设置可以加快删除操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2012-01-16
    • 1970-01-01
    • 2016-03-04
    • 2017-10-19
    相关资源
    最近更新 更多