【问题标题】:PostgreSQL concurrent index creation - invalid indexPostgreSQL 并发索引创建 - 无效索引
【发布时间】:2017-10-11 09:03:35
【问题描述】:

我们需要在不锁定表的情况下包含索引大小。我尝试使用“同时创建索引..”但它导致在其中一个系统上创建无效索引。我们试图做 - 删除索引 - 同时删除索引 - 重新索引表 然而,他们也间歇性地被卡住了。这使得通过脚本同时创建索引的整个方法很容易受到攻击。

任何想法如何在没有人工干预的情况下进行充分证明?如果没有,还有哪些其他有效方法可以在大型和繁忙的表上以自动方式在 postgreSQL 上包含索引大小。

【问题讨论】:

  • 无效索引通常是由于在运行时取消了并发索引创建。索引创建是否成功完成?
  • “包含索引大小”是什么意思?索引具有它需要的大小,并且该大小是不可配置的。 CREATE/DROP INDEX CONCURRENTLY 仍然需要对表进行排他锁,但只需要很短的时间。没有办法避免这种情况,而且在繁忙的服务器上可能会造成破坏。
  • 我的意思是减少随时间增长的 PG 表的索引大小 - 这可以使用重新索引表/创建 - 删除索引来完成,但这两者都是侵入性技术
  • 激进的真空设置是否有助于保持索引大小/减少索引膨胀?

标签: postgresql concurrency


【解决方案1】:

要在脚本中同时构建索引,您需要在下一个命令中添加逻辑(因为您不能放入事务)。只需检查下一行中的索引是否无效,如果是,则中止脚本。

我也将反向操作:首先您同时构建新索引。如果成功,放弃旧的。

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

如果在扫描表时出现问题,例如死锁或 唯一索引中的唯一性违规,CREATE INDEX 命令将 失败但留下一个“无效”的索引。该索引将被忽略 出于查询目的,因为它可能不完整;但是它会 仍然消耗更新开销。

另一个区别是常规的 CREATE INDEX 命令可以 在事务块内执行,但同时创建索引 不能。

【讨论】:

  • 如何中止?我们检查了何时尝试 DROP INDEX / DROP INDEX CONCURRENTLY - 两者也间歇性地卡住,并且 reindex 需要大量时间来删除创建的 INVALID 索引
  • reindex 不会同时重建无效索引。如何中止什么?..
  • 当我们尝试删除无效索引时,如何删除无效索引,甚至 DROP INDEX 都卡住了。
  • 等到关系解除锁定并删除它。否则取消/终止后端并进行维护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2017-08-15
  • 2017-04-27
  • 1970-01-01
相关资源
最近更新 更多