Postgres 重新索引与删除并创建

zel*_*nka 4 postgresql

这些命令之间有什么区别:

reindex database my_db
Run Code Online (Sandbox Code Playgroud)

和

drop index my_index;
CREATE INDEX index1 ON schema1.table1 USING btree (table1_key);
Run Code Online (Sandbox Code Playgroud)

您在哪里为数据库中的每个索引执行第二个命令?

- - - 编辑 - - -

一个答案指出这两个命令具有不同的锁定行为。除了不同的锁,命令对数据库的操作有什么不同吗?例如,如果我获取了一个 VM 的副本并执行了命令 A(重新索引),然后获取了另一个 VM 副本,恢复了 VM 的原始副本,执行了命令 B(删除并创建了所有索引)并制作了另一个副本, A 后和 B 后数据库是否相同?如果不是,哪些事情会导致差异?

Nic*_*ick 5

它们略有不同。

REINDEX 锁定写入,但不锁定读取。

DROP INDEX锁定写入和读取,然后CREATE INDEX锁定仅写入。

REINDEX 类似于索引的删除和重新创建,因为索引内容是从头开始重建的。然而,锁定的考虑是相当不同的。REINDEX 锁定索引的父表的写入而不是读取。它还对正在处理的特定索引进行排他锁,这将阻止尝试使用该索引的读取。相比之下,DROP INDEX 会暂时对父表进行排他锁,从而阻止写入和读取。随后的 CREATE INDEX 锁定写入但不锁定读取;由于索引不存在,没有读取会尝试使用它,这意味着不会有阻塞,但读取可能会被迫进行昂贵的顺序扫描。

来源:https : //www.postgresql.org/docs/9.5/static/sql-reindex.html(在注释下)

  • 此外,您可以“同时创建索引”,然后删除旧的并将新的重命名为旧的。这将为您提供更长的构建时间,但几乎可以使用最小锁定时间进行在线重建。`drop/create` 的另一大优势 - 你可以使用它来改变索引上的位置,而 `reindex` 只会重建它。 (2认同)