Postgresql Postgres重新索引vs拖放和创建

Postgresql Postgres重新索引vs拖放和创建,postgresql,Postgresql,这些命令之间是否有任何区别: reindex database my_db 及 对数据库中的每个索引执行第二个命令 -----编辑----- 答案指出这两个命令具有不同的锁定行为。除了不同的锁之外,命令在数据库上的操作方式是否有差异?例如,如果我获取一个VM的副本,并执行命令a(reindex),然后获取另一个VM副本,恢复VM的原始副本,执行命令B(删除并创建所有索引)并创建另一个副本,那么post-a和post-B数据库是否相同?如果不是,什么样的事情会导致差异?它们略有不同 REINDE

这些命令之间是否有任何区别:

reindex database my_db

对数据库中的每个索引执行第二个命令

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


答案指出这两个命令具有不同的锁定行为。除了不同的锁之外,命令在数据库上的操作方式是否有差异?例如,如果我获取一个VM的副本,并执行命令a(reindex),然后获取另一个VM副本,恢复VM的原始副本,执行命令B(删除并创建所有索引)并创建另一个副本,那么post-a和post-B数据库是否相同?如果不是,什么样的事情会导致差异?

它们略有不同

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

删除索引
锁定写入和读取,然后
创建索引
仅锁定写入

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


来源:(在注释下)

根据您的编辑-没有像您建议的那样的记录行为,因此唯一确定的方法是执行您自己的测试。dba.SE的可能候选对象。此外,您可以同时创建索引,然后删除旧索引,并将新索引重命名为旧索引。这将为您提供更长的构建时间,但几乎可以使用最小的锁定时间在线重建。
drop/create
的另一大优点是,您可以使用它来更改索引上的位置,而
reindex
只需重建它。
drop index my_index;
CREATE INDEX index1 ON schema1.table1 USING btree (table1_key);