为了加快大型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;
考虑到我的更新涉及的是我的索引不关心的列,是否需要最后一次重新索引?
感谢您的帮助。
答案 0 :(得分:1)
这是导致数据损坏的秘诀。
仅当您的所有所有更新为HOT更新时,此方法才有效,因为仅在这种情况下,行ctid
(索引所引用的物理地址)保留一样。
如果您必须弄乱目录,则仅禁用以后要使用的索引REINDEX
。但是,只需删除这些索引并再次创建它们,将好很多。这样一来,您不必弄乱目录,也不会有数据损坏的风险。
有关HOT的详细信息,请参见the source documentation。