【问题标题】:Postgres building an index concurrentlyPostgres同时建立索引
【发布时间】:2017-08-24 20:18:52
【问题描述】:

我正在从 Postgres 文档中阅读此内容:

同时构建索引

... PostgreSQL 支持在不锁定写入的情况下构建索引。这 通过指定 CREATE 的 CONCURRENTLY 选项调用方法 指数。使用此选项时,PostgreSQL 必须执行两次扫描 表,此外它必须等待所有现有事务 这可能会修改或使用索引来终止。因此这 方法比标准索引构建需要更多的工作,并且需要 完成时间明显更长。但是,由于它允许正常 在建立索引时继续操作,此方法很有用 用于在生产环境中添加新索引....

在并发索引构建中,索引实际上是输入到 一个事务中的系统目录,然后两个表扫描发生在两个 更多的交易。在每次表扫描之前,索引构建必须等待 对于已修改表以终止的现有事务。 第二次扫描后,索引构建必须等待任何事务 在第二次扫描之前有一个快照(参见第 13 章) 终止。然后最后可以将索引标记为可以使用,并且 CREATE INDEX 命令终止。然而,即使那样,该指数也可能不会 可立即用于查询:在最坏的情况下,它不能 只要存在早于索引开始的事务就使用 构建。

什么是系统目录?什么是表扫描?所以听起来索引是先构建的,然后它必须等待现有事务(在索引构建期间发生的事务?)终止,然后等待在第二次扫描之前具有快照的任何事务终止(这是什么是什么意思?它与第一个语句有何不同)。这些扫描是什么?

【问题讨论】:

  • 系统目录是存储数据库信息的表:表、列、类型、键等元信息,可以这么说。表扫描是从上到下读取表(并且可能对遇到的任何事情做一些事情)

标签: postgresql


【解决方案1】:
  1. 什么是系统目录? - https://www.postgresql.org/docs/current/static/catalogs.html
  2. 什么是表扫描? - 它读取表格以获取您建立索引的列的值。
  3. 在索引构建期间发生的那些? - 不,可以在第一次表扫描后更改数据
  4. 这是什么意思?这意味着它等待交易结束。
  5. 这些扫描是什么?在开始并发建立索引之前,首先扫描读取表。允许更改表以避免锁定。构建完成后,它会粗略地扫描并说出不同之处,应用一个短锁并将索引标记为可用。它与create index 的不同之处在于最后一个锁定表,不允许对数据进行任何更改,而concurrently 扫描两次,但允许在构建索引时更改数据

【讨论】:

  • 所以我想它需要进行表扫描才能建立索引?另外,在第一次表扫描期间未发出的在第一次表扫描后可以更改数据的事务是什么?
  • 是的。想象一下时间顺序:1.用户a输入create index concurently...并按下回车键,2.用户b在表中插入一行。在用户开始构建索引时,该新行不在表中。这是此类交易的示例
  • @Jwan622 我回答你的问题了吗?
  • 所以当我写...'3。在索引构建期间发生的那些'并且您说,不,那些可以在第一次表扫描后更改数据的那些/在我按下回车键后试图向表中插入一行的那些......有什么区别?这不是我说的吗?
  • 是的。我回答了你剩下的问题了吗?所以如果我编辑 N3 你会接受吗?..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
相关资源
最近更新 更多