首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Postgres SQL语句性能

Postgres SQL语句性能
EN

Stack Overflow用户
提问于 2018-06-06 04:16:36
回答 2查看 73关注 0票数 2

我有一个Postgres实例在一个16核/32 Gb的WIndows服务器工作站上运行。

我遵循了我在这样的地方看到的性能改进技巧:https://www.postgresql.org/docs/9.3/static/performance-tips.html

当我运行像这样的更新时:

代码语言:javascript
复制
analyze;
update amazon_v2 
  set states_id = amazon.states_id, 
  geom = amazon.geom
from amazon
where amazon_v2.fid = amazon.fid

其中fid是两个表中的主键,并且两个表都有68M条记录,几乎需要一天的时间才能运行。

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

EN

回答 2

Stack Overflow用户

发布于 2018-06-06 04:27:58

您没有显示执行计划,但我打赌它可能正在amazon_v2上执行全表扫描,并在amazon上使用索引查找

我在这里看不到如何提高性能,因为它已经接近最优。我唯一能想到的就是使用表分区和并行化执行。

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

票数 2
EN

Stack Overflow用户

发布于 2018-06-06 15:23:27

您的查询是在非常日志的事务中执行的。该事务可能被其他写入器阻塞。查询pg_locks

长事务对自动真空的性能有负面影响。执行时间是否会增加其他时间?如果是,请检查table bloat

当较大的事务进入较小的事务时,性能通常会提高。不幸的是,操作不再是原子的,并且没有关于最佳批处理大小的黄金法则。

你也应该听从https://stackoverflow.com/a/50708451/6702373的建议

让我们总结一下:

分区表仅更新已修改的行(如果只有几行是modified)

  • Check锁,则使用issues)

  • Split

  • 检查表膨胀

  • 检查硬件利用率(与其他操作相关)使用delete/truncate & insert/copy将操作插入到batches.

  • Replace updates中(如果更新更改了大多数行,则此操作有效)。分区表(如果没有其他帮助)分区表

<

  • >F218>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50708275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档