这些命令之间有什么区别:
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 后数据库是否相同?如果不是,哪些事情会导致差异?
它们略有不同。
REINDEX 锁定写入,但不锁定读取。
DROP INDEX锁定写入和读取,然后CREATE INDEX锁定仅写入。
REINDEX 类似于索引的删除和重新创建,因为索引内容是从头开始重建的。然而,锁定的考虑是相当不同的。REINDEX 锁定索引的父表的写入而不是读取。它还对正在处理的特定索引进行排他锁,这将阻止尝试使用该索引的读取。相比之下,DROP INDEX 会暂时对父表进行排他锁,从而阻止写入和读取。随后的 CREATE INDEX 锁定写入但不锁定读取;由于索引不存在,没有读取会尝试使用它,这意味着不会有阻塞,但读取可能会被迫进行昂贵的顺序扫描。
来源:https : //www.postgresql.org/docs/9.5/static/sql-reindex.html(在注释下)