我正在为我正在开发的Rails应用程序优化PostgreSQL 9.1数据库。在postgresql.conf中我设置了
log_min_duration_statement = 200然后我使用PgBadger来分析日志文件。到目前为止,大部分时间所作的陈述是:
COMMIT;我没有得到比这更多的信息,我对这是什么说法感到非常困惑。有人知道我能做些什么来获得更多关于提交查询的详细信息吗?所有其他查询都会显示语句、SELECT、UPDATE等中使用的变量,而不是提交查询。
发布于 2012-10-30 09:31:46
COMMIT是完全有效的语句,其目的是提交当前挂起的事务。由于它所做的事情的本质--确保数据真的被刷新到磁盘上,它很可能会占用大部分时间。
你怎样才能让你的应用工作得更快?现在,您的代码很可能正在使用所谓的自动提交模式--也就是说,每条语句都是含蓄的COMMIT'ted。如果您显式地将较大的块包装到BEGIN TRANSACTION; . COMMIT;块中,您将使应用程序工作得更快,并减少提交次数。祝好运!
发布于 2012-10-30 10:32:40
正如@mvp所指出的,如果COMMIT慢,通常的原因是fsync()慢,因为每个事务提交都必须将数据刷新到磁盘--通常使用fsync()调用。不过,这并不是缓慢提交的唯一原因。你可以:
commit_delay集-我还没有验证延迟提交是否被记录为长时间运行的语句,但这似乎是合理的如果fsync()比较慢,最好的选择是重新构造您的工作,以便可以在较少的较大事务中运行它。一个合理的选择可以是使用commit_delay来分组提交;这将使组提交提高总体吞吐量,但实际上会降低单个事务的速度。
更好的是,解决问题的根源。升级到带有电池回写缓存的RAID控制器,或者升级到高质量的SSD,它是电源故障安全的。要知道,普通磁盘通常每次旋转时只能执行不到一个fsync(),或者根据硬盘驱动器的不同,每分钟执行5400到15000次。有了大量的事务和大量的提交,这将大大限制您的吞吐量,特别是因为如果它们所做的只是琐碎的刷新,那么这是最好的情况。相反,如果您在RAID控制器或SSD上有一个持久的写缓存,操作系统不需要确保数据实际上在硬盘上,它只需要确保到达持久的写缓存--这个速度要快得多,因为这通常只是一些电源保护的RAM。
可能fsync()不是真正的问题;它可能是缓慢的检查站。查看的最佳方法是检查日志,看看是否有人抱怨检查点发生得太频繁或时间过长。您还可以使log_checkpoints记录检查点的时间和频率。
如果检查点花费的时间太长,请考虑调优bgwriter完成目标(请参阅文档)。如果它们太频繁,增加checkpoint_segments。
有关详细信息,请参阅调优PostgreSQL服务器。
发布于 2012-10-30 09:48:10
尝试记录每一个查询几天,然后在COMMIT语句之前查看事务中发生了什么。
log_min_duration_statement =0
https://stackoverflow.com/questions/13135422
复制相似问题