2016-07-06 68 views
1

我們有150M行的文件與這樣的命令更新PostgreSQL數據庫中只有一個表:什麼是應用在PostgreSQL表150M更新的最快方法

UPDATE "events" SET "value_1" = XX, "value_2" = XX, "value_3" = XX, "value_4" = XX WHERE "events"."id" = SOME_ID; 

所有的ID是唯一的,有沒有辦法將該更新應用於多個事件。目前,如果我們在psql中使用\i update.sql執行此操作,則需要大約幾天的時間。

有沒有更快的方法來運行它?

+1

你嘗試運行與自動提交_disabled_作爲一個單一的交易? –

+0

它會如何影響數據庫,因爲它每秒鐘有幾百個操作數,對於整個更新,我們是否可以搞砸數據或鎖定表? – nateless

+0

你有關於「事件」的索引嗎?「id」? – Jayadevan

回答

3
  • 最簡單的:前加set synchronous_commit=off\i update.sql

  • 更好:

    • 斯普利特文件像100000次的更新部分:在平行
      split -l 100000 -a 6 --additional-suffix=.sql update.sql update-part
    • 運行這些更新,每個文件在單筆交易中,例如:
      /bin/ls update-part*.sql \ | xargs --max-procs=8 --replace psql --single-transaction --file={}
相關問題