Postgres优化更新

时间:2011-07-08 09:48:30

标签: performance postgresql

我必须做一些复杂的数据导入。我需要做一些UPDATE,目前在一个查询中更新超过300万行。该查询每个应用大约30-45秒(其中一些甚至4-5分钟)。我的问题是,我是否可以加快速度。我在哪里可以阅读有关它的内容,什么样的索引以及我可以设置哪些列来改进这些更新。我不需要exacly回答,所以我不显示表格。我正在寻找一些东西来了解它。

2 个答案:

答案 0 :(得分:6)

两件事:

1)发布您EXPLAIN ANALYZE查询的UPDATE

2)如果您的UPDATE不需要是原子的,那么您可能需要考虑拆分受UPDATE影响的行数。为了最大限度地减少因超过Free Space Map而导致的“丢失行数”,请考虑以下方法:

  1. BEGIN
  2. UPDATE ... LIMIT N;或某些限制行数的谓词(例如WHERE username ilike 'a%';)。
  3. COMMIT
  4. VACUUM table_being_updated
  5. 重复步骤1-4,直到更新所有行。
  6. ANALYZE table_being_updated
  7. 我怀疑您正在更新表中的每一行,并且不需要在单个事务结束时使用新值显示所有行,因此上述方法可以打破UPDATE较小的交易将是一个很好的方法。

    是的,INDEX谓词中指定的相关列上的UPDATE将有助于提供帮助。如果您需要进一步的帮助,请再次发布EXPLAIN ANALYZE

答案 1 :(得分:0)

如果通过 多个UPDATE 表示每个更新行有一个UPDATE命令,则问题是所有目标表的索引都将更新,所有约束都将是检查每个更新的行。如果是这种情况,那么请尝试使用单个UPDATE更新所有行:

update t
set a = t2.b 
from t2
where t.id = t2.id

如果导入的数据位于文本文件中,则首先将其插入临时表并从那里进行更新。请参阅我的回答here