首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在慢速查询的PostgreSQL日志中大量的“提交;”

在慢速查询的PostgreSQL日志中大量的“提交;”
EN

Stack Overflow用户
提问于 2012-10-30 08:47:14
回答 3查看 6.4K关注 0票数 8

我正在为我正在开发的Rails应用程序优化PostgreSQL 9.1数据库。在postgresql.conf中我设置了

代码语言:javascript
复制
log_min_duration_statement = 200

然后我使用PgBadger来分析日志文件。到目前为止,大部分时间所作的陈述是:

代码语言:javascript
复制
COMMIT;

我没有得到比这更多的信息,我对这是什么说法感到非常困惑。有人知道我能做些什么来获得更多关于提交查询的详细信息吗?所有其他查询都会显示语句、SELECT、UPDATE等中使用的变量,而不是提交查询。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-30 09:31:46

COMMIT是完全有效的语句,其目的是提交当前挂起的事务。由于它所做的事情的本质--确保数据真的被刷新到磁盘上,它很可能会占用大部分时间。

你怎样才能让你的应用工作得更快?现在,您的代码很可能正在使用所谓的自动提交模式--也就是说,每条语句都是含蓄的COMMIT'ted。如果您显式地将较大的块包装到BEGIN TRANSACTION; . COMMIT;块中,您将使应用程序工作得更快,并减少提交次数。祝好运!

票数 6
EN

Stack Overflow用户

发布于 2012-10-30 10:32:40

正如@mvp所指出的,如果COMMIT慢,通常的原因是fsync()慢,因为每个事务提交都必须将数据刷新到磁盘--通常使用fsync()调用。不过,这并不是缓慢提交的唯一原因。你可以:

  • 如前所述,具有缓慢的fsync()s
  • 让缓慢的检查点延迟I/O
  • 有一个commit_delay集-我还没有验证延迟提交是否被记录为长时间运行的语句,但这似乎是合理的

如果fsync()比较慢,最好的选择是重新构造您的工作,以便可以在较少的较大事务中运行它。一个合理的选择可以是使用commit_delay来分组提交;这将使组提交提高总体吞吐量,但实际上会降低单个事务的速度。

更好的是,解决问题的根源。升级到带有电池回写缓存的RAID控制器,或者升级到高质量的SSD,它是电源故障安全的。要知道,普通磁盘通常每次旋转时只能执行不到一个fsync(),或者根据硬盘驱动器的不同,每分钟执行5400到15000次。有了大量的事务和大量的提交,这将大大限制您的吞吐量,特别是因为如果它们所做的只是琐碎的刷新,那么这是最好的情况。相反,如果您在RAID控制器或SSD上有一个持久的写缓存,操作系统不需要确保数据实际上在硬盘上,它只需要确保到达持久的写缓存--这个速度要快得多,因为这通常只是一些电源保护的RAM。

可能fsync()不是真正的问题;它可能是缓慢的检查站。查看的最佳方法是检查日志,看看是否有人抱怨检查点发生得太频繁或时间过长。您还可以使log_checkpoints记录检查点的时间和频率。

如果检查点花费的时间太长,请考虑调优bgwriter完成目标(请参阅文档)。如果它们太频繁,增加checkpoint_segments

有关详细信息,请参阅调优PostgreSQL服务器

票数 10
EN

Stack Overflow用户

发布于 2012-10-30 09:48:10

尝试记录每一个查询几天,然后在COMMIT语句之前查看事务中发生了什么。

log_min_duration_statement =0

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

https://stackoverflow.com/questions/13135422

复制
相关文章

相似问题

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