Postgres同时构建索引

时间:2017-03-30 18:33:03

标签: postgresql

我从Postgres文档中读到这篇文章:

  

同时构建索引

     

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

     

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

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

1 个答案:

答案 0 :(得分:1)

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