使用多个并发进程时如何提高 PostgreSQL 的性能?

Jua*_*oto 6 postgresql concurrency

在我们的 Python 应用程序上看到查询性能并不令人满意,该应用程序运行多个SQLAlchemy core用于访问 PostgreSQL 9.2 数据库的进程。我们可能有大约 100-200 个或更多并发进程对数据库执行查询

我们没有像pgpoolIIpgbounce当前安装的连接池系统。

我测试了查询,可以采取的顺序1-10秒,从我们的应用程序,它运行在何时psql最多20毫秒

我们认为这个问题与并发连接有关,特别是因为上述行为,并且因为我们在访问系统中的不同表时看到这些性能下降。但是,我们对此并不确定,可以很容易地接受替代建议或解决方案。

处理来自单个数据库服务器的多个进程的并发连接的常用方法是什么,以使查询能够快速执行?

Pad*_*oll 3

当你说你没有池时,你有点回答你自己的问题,但是......

这不是开箱即用的答案,对于所有客户端/数据库内容,您可能需要做一些工作来确定到底出了什么问题

备份 postgresql.conf 更改

log_min_duration_statement to 0 
log_destination = 'csvlog'              # Valid values are combinations of      
logging_collector = on                # Enable capturing of stderr and csvlog 
log_directory = 'pg_log'                # directory where log files are written,
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,        
debug_print_parse = on
debug_print_rewritten = on
debug_print_plan output = on
log_min_messages = info (debug1 for all server versions prior to 8.4)
Run Code Online (Sandbox Code Playgroud)

停止并重新启动数据库服务器(重新加载可能无法获取更改)重现测试,确保服务器时间和客户端时间匹配,并记录开始时间等。

将日志文件从导入复制到您选择的编辑器中(Excel 或其他电子表格对于获取 SQL 和计划等的高级操作非常有用)

现在检查服务器端的计时并注意:

每种情况下服务器上报告的 sql 是否相同

如果相同,你应该有相同的时间

是客户端生成游标而不是传递sql

是当您认为应该执行时到达服务器的查询

是一个驱动程序在字符集之间进行大量转换/转换或其他类型(例如日期或时间戳)的隐式转换。

等等

为了完整性,将包括计划数据,这可以告知客户提交的 SQL 是否存在重大差异。