Postgres并行/高效加载大量数据psycopg

时间:2017-05-13 17:15:06

标签: postgresql parallel-processing locking load

我想从CSV文件中加载很多行 该文件包含这些数据" article _name,article_time,start_time,end_time"

桌子上有一个禁令:对于相同的文章名称,如果新的article_time属于同一篇文章的现有范围[start_time,end_time],我就不会插入新行。
即:如果存在[start_time_x,end_time_x],则不要插入行y,其中time_article_y在范围[start_time_x,end_time_x]内,其中article_ name_ y = article_ name_ x

  • 我尝试使用psycopg选择现有文章名称,如果存在重叠,则手动检查广告 - >太久了
  • 我再次尝试使用psycopg,这次通过设置一个条件'排除使用...'和tryig一起插入指定"冲突时什么都不做" (这样它不会失败)但仍然太长
  • 我尝试了同样的事情,但这次尝试在每次执行调用时插入许多值(psycopg):它有一点好处(在几乎10分钟内处理了1M行),但仍然没有它需要的那么快对于我有的数据量(500M +)
  • 我尝试通过多次调用相同的脚本来进行并行化,在不同的文件上,但时间没有变得更好,我想是因为每次我们想写东西时桌子上都有锁

有没有办法只在包含相同article_name的行上创建锁? (而不是锁定整个桌子?)
您能否帮助解决这个问题,使其具有平行性和/或更高的时间效率?

很多感谢的人

1 个答案:

答案 0 :(得分:0)

您的排除约束和INSERT ... ON CONFLICT的想法很好。

您可以按如下方式提高速度:

  • 在一次交易中完成所有工作。

  • 像Vao Tsun建议的那样,可能先将数据COPY放入临时表中,然后使用单个SQL语句完成所有操作。

  • 从修改数据的表中删除除排除约束之外的所有索引,并在完成后重新创建它们。

  • 在加载数据时,通过禁用autovacuum并提升max_wal_size(或checkpoint_segments旧版PostgreSQL版本)来加快插入速度。