这些命令之间有什么区别:
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数据库是否相同?如果不是,会有什么样的东西会造成分歧?
答案 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下)