【发布时间】:2015-09-20 17:13:55
【问题描述】:
我在 Postgres 9.4 db 中有一个包含大约 3000 万行的表。该表有 6 列,主键 id、2 个文本、一个布尔值和两个时间戳。其中一个文本列上有索引,显然是主键。
我想复制第一个时间戳列中的值,将其命名为 timestamp_a 到第二个时间戳列,命名为 timestamp_b。为此,我运行了以下查询:
UPDATE my_table SET timestamp_b = timestamp_a;
这行得通,但需要一个小时 15 分钟才能完成,这对我来说似乎真的很长,据我所知,它只是将值从一列复制到下一列。
我在查询中运行了EXPLAIN,似乎没有什么特别低效的。然后我使用pgtune 来修改我的配置文件,最明显的是它增加了shared_buffers、work_mem 和maintenance_work_mem。
我重新运行了查询,它所用的时间基本相同,实际上稍长一些(一小时 20 分钟)。
我还能做些什么来提高此更新的速度?这只是将 3000 万个时间戳写入 postgres 需要多长时间吗?对于上下文,我在 macbook pro、osx、quadcore、16 gigs 的 ram 上运行它。
【问题讨论】:
-
复制列是否有索引?如果不在索引记录上尝试相同的查询
-
@NavasBasheer:如果您更新所有行,索引将无济于事。实际上,索引会减慢更新速度。 Steve:如果
timestamp_b上有索引,那么在运行更新之前删除该索引。 -
@a_horse_with_no_name:感谢您的信息
-
首先我会尝试增量更新。您可以在 interesting post 中了解此方法和其他方法。
-
@klin 感谢这篇文章,我会尝试其中一些策略。
标签: sql postgresql