2016-07-06 71 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={}
相关问题