我是在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语句的性能?我应该编写一个存储过程来按记录处理它,例如?
答案 0 :(得分:2)
您没有显示执行计划,但我敢打赌它可能会在amazon_v2
上执行全表扫描并在{{1}上使用索引搜索 }}。
我不知道如何在这里提高性能,因为它已接近最佳状态。我能想到的唯一想法是使用表分区并并行化执行。
另一种完全不同的策略是仅更新“已修改”的行。也许你可以跟踪这些,以避免每次更新所有6800万行。
答案 1 :(得分:1)
您的查询是在非常日志的事务中执行的。该交易可能被其他作者阻止。查询pg_locks。
长期交易对autovacuum的性能有负面影响。执行时间会增加吗?如果,请检查table bloat。
当大型交易变得更小时,性能通常会提高。不幸的是,操作不再是原子操作,并且没有关于最佳批量大小的黄金法则。
您还应该遵循https://stackoverflow.com/a/50708451/6702373
的建议让我们总结一下:
仅更新已修改的行(如果只修改了几行)
检查锁
检查表膨胀
检查硬件利用率(与其他问题相关)
将操作分成批次。
使用delete / truncate&替换更新插入/复制(如果更新更改了大多数行,则此方法有效。)
(如果没有别的帮助)分区表