查询Postgres中单个连接的并行化

时间:2015-09-17 12:09:05

标签: sql database performance postgresql

我知道多个连接在postgres中使用多个CPU内核并因此并行运行。但是当我执行长时间运行的查询时说30秒(假设这不能进一步优化),I / O被阻塞并且它不会从同一客户端/连接运行任何其他查询。

这是设计还是可以改进?

所以我假设运行长时间运行查询的最佳方法是获取新连接或不在同一连接中运行任何其他查询,直到该查询完成为止?

1 个答案:

答案 0 :(得分:3)

这是一个设计限制。

PostgreSQL每个连接使用一个进程,每个进程有一个会话。每个进程都是单线程的,并且大量使用从postmaster通过fork()继承的全局变量。共享内存是明确管理的。

这在易于开发,调试和维护方面具有一些很大的优势,并且在面对错误时使系统更加健壮。但是,它使得在查询级别添加并行化变得非常困难。

正在进行添加并行查询支持的工作,但目前系统实际上仅限于每个查询使用一个CPU核心。它可以从某些区域的并行I / O中受益,例如位图索引扫描(通过effective_io_concurrency),但在其他区域则不行。

有一些IMO非常糟糕的解决方法,如PL/Proxy,但大多数情况下,如果需要,你必须自己处理客户端的并行化。这正在迅速成为影响PostgreSQL的一个更重要的限制因素。应用程序可以将大型查询拆分为多个影响数据子集的较小查询,然后统一客户端(或统一到未记录的表,然后进行进一步处理),即map / reduce样式模式。如果需要大量长时间运行查询和低延迟OLTP查询,则需要多个连接,应用程序通常应使用内部连接池。