2011-07-08 66 views
1

我必須做一些複雜的數據導入。我需要做一些更新,當前在一個查詢中更新超過300萬行。該查詢每個應用約30-45秒(其中一些甚至4-5分鐘)。我的問題是,我是否可以加快速度。我在哪裏可以讀到關於它的信息,可以設置哪些索引以及在哪些列上改進這些更新。我不需要很簡單的回答,所以我不會顯示錶格。我正在尋找一些東西來了解它。Postgres優化更新

+0

請發佈UPDATE語句的執行計劃(或者作爲此處的格式化代碼或作爲http://explain.depesz.com/的鏈接)。您可能還想閱讀這篇文章:http://wiki.postgresql.org/wiki/SlowQueryQuestions,以便在發佈這類問題時找出哪些信息是有用的 –

回答

5

兩件事情:

1)發表您的UPDATE查詢的EXPLAIN ANALYZE。 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

我懷疑你是在爲你更新表中的每一行,並不需要所有的行可見與單個交易結束的新值,因此打破了上述的做法UPDATE進入較小的交易將是一個好方法。

是的,在UPDATE的謂詞中指定的相關列上的INDEX將有助於顯着幫助。如果您需要更多幫助,請再次發帖EXPLAIN ANALYZE

0

如果更新次數的你的意思是一個UPDATE命令每個更新的行,那麼問題是,所有的目標表的索引將被更新,所有限制將在每一個更新的行進行檢查。如果是這樣的話,那麼嘗試用,而不是一個單一的更新來更新所有行:

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

如果導入的數據是文本文件,然後從那裏將它插入一個臨時表第一和更新。見我的回答here