我有一个Postgres实例在一个16核/32 Gb的WIndows服务器工作站上运行。
我遵循了我在这样的地方看到的性能改进技巧: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语句的性能?例如,我是否应该编写一个存储过程来逐条记录地处理它?
发布于 2018-06-06 04:27:58
您没有显示执行计划,但我打赌它可能正在amazon_v2
上执行全表扫描,并在amazon
上使用索引查找。
我在这里看不到如何提高性能,因为它已经接近最优。我唯一能想到的就是使用表分区和并行化执行。
另一种完全不同的策略是只更新“已修改”的行。也许您可以跟踪这些行,以避免每次都更新全部6800万行。
发布于 2018-06-06 15:23:27
您的查询是在非常日志的事务中执行的。该事务可能被其他写入器阻塞。查询pg_locks。
长事务对自动真空的性能有负面影响。执行时间是否会增加其他时间?如果是,请检查table bloat。
当较大的事务进入较小的事务时,性能通常会提高。不幸的是,操作不再是原子的,并且没有关于最佳批处理大小的黄金法则。
你也应该听从https://stackoverflow.com/a/50708451/6702373的建议
让我们总结一下:
分区表仅更新已修改的行(如果只有几行是modified)
<
https://stackoverflow.com/questions/50708275
复制相似问题