Postgres reindex vs drop and create

时间:2016-07-19 20:18:22

标签: postgresql

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

reindex database my_db

drop index my_index;
CREATE INDEX index1 ON schema1.table1 USING btree (table1_key);

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

-----编辑-----

答案指出这两个命令具有不同的锁定行为。除了不同的锁之外,命令在数据库上的操作方式有何不同?例如,如果我获取了VM的副本并执行了命令A(reindex)然后获取了VM的另一个副本,则还原VM的原始副本,执行命令B(删除并创建所有索引)并制作另一个副本,后A和后B数据库是否相同?如果不是,会有什么样的东西会造成分歧?

1 个答案:

答案 0 :(得分:1)

它们略有不同。

REINDEX锁定写入,但不读取。

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

  

REINDEX类似于索引的删除和重新创建,因为索引内容是从头开始重建的。但是,锁定考虑因素是相当不同的。 REINDEX锁定写入但不读取索引的父表。它还对正在处理的特定索引进行独占锁定,这将阻止尝试使用该索引的读取。相反,DROP INDEX暂时在父表上进行独占锁定,阻止写入和读取。随后的CREATE INDEX锁定写入但不读取;因为索引不在那里,所以没有读取会尝试使用它,这意味着没有阻塞,但读取可能会被强制进行昂贵的顺序扫描。

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

相关问题