在索引不关心的列上进行大量更新后,我应该重新索引表吗?

时间:2019-06-17 09:18:44

标签: postgresql indexing

为了加快大型Postgresql表的更新速度,我禁用了索引:

UPDATE pg_index SET indisready=false WHERE indrelid = ( SELECT oid FROM pg_class WHERE relname='mytable')

然后运行我的更新:

update mytable set ......

然后启用我的索引:

UPDATE pg_index SET indisready=true WHERE indrelid = ( SELECT oid FROM pg_class WHERE relname='mytable');

然后重新编制索引:

REINDEX table mytable;

考虑到我的更新涉及的是我的索引不关心的列,是否需要最后一次重新索引?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是导致数据损坏的秘诀。

仅当您的所有所有更新为HOT更新时,此方法才有效,因为仅在这种情况下,行ctid(索引所引用的物理地址)保留一样。

如果您必须弄乱目录,则仅禁用以后要使用的索引REINDEX。但是,只需删除这些索引并再次创建它们,将好很多。这样一来,您不必弄乱目录,也不会有数据损坏的风险。

有关HOT的详细信息,请参见the source documentation