【问题标题】:PostgreSQL - When do indices get build and when to use CONCURRENTLY?PostgreSQL - 何时构建索引以及何时同时使用?
【发布时间】:2015-09-30 20:40:57
【问题描述】:

我对 SQL(或这里的 PostgreSQL)相当缺乏经验,我正在尝试正确理解和使用索引。

PostgreSQL 为CREATE INDEXthe documentation says 提供了一个CONCURRENTLY 选项:

"使用此选项时,PostgreSQL 必须执行两次表扫描,此外它必须等待所有可能使用索引的现有事务终止。因此,此方法需要的总工作量比标准的索引构建,并且需要更长的时间才能完成。但是,由于它允许在构建索引的同时继续正常操作,因此此方法对于在生产环境中添加新索引很有用。"

  • 这是否意味着INDEX 仅在启动时或迁移过程中创建?

我知道,如果表随着时间的推移变得碎片化,可以重新索引表(不知道这实际上是如何发生的,以及为什么索引没有保持“最新”),并且重新索引有助于数据库再次变得更有效率。

  • 在这样的重新索引过程中,我可以从CONCURRENTLY 中受益吗?

除此之外,我也在问自己

  • 是否存在我应该避免 CONCURRENTLY 的情况,或者在我创建的每个 INDEX 上使用 CONCURRENTLY 会不会有伤害?

【问题讨论】:

  • at startupduring a migration process 是什么意思?
  • @wildplasser “在启动时”是指在整个服务器实例重新启动后可能需要启动的 PostgreSQL 服务器。 “在迁移过程中”是指如果我例如在已包含数据的现有表上创建新索引。
  • "startup" :索引一个表(技术上)。它保存在磁盘上,就像普通的表一样。 “迁移”:可以称为 DDL 操作(数据定义语言)它基本上是对现有模式(模型)的更改。

标签: postgresql


【解决方案1】:

如果始终使用create index ... concurrently 是明智的,那将是默认设置。

它的作用是在被索引的表上使用较弱的锁来构建索引,因此您可以继续插入、更新、删除等。

这是有代价的:

  • 与几乎所有其他 DDL 不同,您不能在事务中使用 create index ... concurrently
  • 索引构建可能需要更长的时间
  • 构建的索引布局可能效率较低(更慢、更大)
  • create index 很少会失败,因此您必须删除并重新创建索引

您不能轻易地使用它来重新创建现有索引。 PostgreSQL 还不支持reindex ... concurently。有一些变通方法,您可以创建一个新索引,然后交换旧索引和新索引,但如果您尝试对作为外键约束目标的唯一索引或主键执行此操作,则非常困难。

除非您知道自己需要它,否则只需使用 create index 而不使用 concurrently

【讨论】:

  • "如果总是合理的话 create index ... concurrently 这将是默认值。" 非常合理!谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2011-05-04
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
相关资源
最近更新 更多