Postgres SQL语句表现

时间:2018-06-05 20:16:36

标签: sql postgresql query-performance

我是在16核/ 32 Gb WIndows Server工作站上运行的Postgres实例。

我遵循了我在以下地方看到的性能改进提示:https://www.postgresql.org/docs/9.3/static/performance-tips.html

当我运行更新时:

analyze;
update amazon_v2 
  set states_id = amazon.states_id, 
  geom = amazon.geom
from amazon
where amazon_v2.fid = amazon.fid

其中fid是两个表中的主键,两者都有68M记录,运行几乎需要一天。

有没有办法提高像这样的SQL语句的性能?我应该编写一个存储过程来按记录处理它,例如?

2 个答案:

答案 0 :(得分:2)

您没有显示执行计划,但我敢打赌它可能会在amazon_v2上执行全表扫描并在{{1}上使用索引搜索 }}。

我不知道如何在这里提高性能,因为它已接近最佳状态。我能想到的唯一想法是使用表分区并并行化执行。

另一种完全不同的策略是仅更新“已修改”的行。也许你可以跟踪这些,以避免每次更新所有6800万行。

答案 1 :(得分:1)

您的查询是在非常日志的事务中执行的。该交易可能被其他作者阻止。查询pg_locks

长期交易对autovacuum的性能有负面影响。执行时间会增加吗?如果,请检查table bloat

当大型交易变得更小时,性能通常会提高。不幸的是,操作不再是原子操作,并且没有关于最佳批量大小的黄金法则。

您还应该遵循https://stackoverflow.com/a/50708451/6702373

的建议

让我们总结一下:

  • 仅更新已修改的行(如果只修改了几行)

  • 检查锁

  • 检查表膨胀

  • 检查硬件利用率(与其他问题相关)

  • 将操作分成批次。

  • 使用delete / truncate&替换更新插入/复制(如果更新更改了大多数行,则此方法有效。)

  • (如果没有别的帮助)分区表