我必须做一些复杂的数据导入。我需要做一些UPDATE,目前在一个查询中更新超过300万行。该查询每个应用大约30-45秒(其中一些甚至4-5分钟)。我的问题是,我是否可以加快速度。我在哪里可以阅读有关它的内容,什么样的索引以及我可以设置哪些列来改进这些更新。我不需要exacly回答,所以我不显示表格。我正在寻找一些东西来了解它。
答案 0 :(得分:6)
两件事:
1)发布您EXPLAIN ANALYZE
查询的UPDATE
。
2)如果您的UPDATE
不需要是原子的,那么您可能需要考虑拆分受UPDATE
影响的行数。为了最大限度地减少因超过Free Space Map而导致的“丢失行数”,请考虑以下方法:
BEGIN
UPDATE ... LIMIT N;
或某些限制行数的谓词(例如WHERE username ilike 'a%';
)。COMMIT
VACUUM table_being_updated
ANALYZE table_being_updated
我怀疑您正在更新表中的每一行,并且不需要在单个事务结束时使用新值显示所有行,因此上述方法可以打破UPDATE
较小的交易将是一个很好的方法。
是的,INDEX
谓词中指定的相关列上的UPDATE
将有助于提供帮助。如果您需要进一步的帮助,请再次发布EXPLAIN ANALYZE
。
答案 1 :(得分:0)
如果通过 多个UPDATE 表示每个更新行有一个UPDATE命令,则问题是所有目标表的索引都将更新,所有约束都将是检查每个更新的行。如果是这种情况,那么请尝试使用单个UPDATE更新所有行:
update t
set a = t2.b
from t2
where t.id = t2.id
如果导入的数据位于文本文件中,则首先将其插入临时表并从那里进行更新。请参阅我的回答here