单个 PostgreSQL 查询可以使用多个内核吗?

Ali*_*eza 64 postgresql performance parallelism query-performance

在最新版本的 PostgreSQL 中(截至 2013 年 12 月),我们能否在两个或多个内核之间共享查询以提高性能?还是我们应该获得更快的内核?

小智 56

不,对于 v9.6 之前的 PostgreSQL 版本。请参阅PostgreSQL 常见问题PostgreSQL如何使用 CPU 资源?

PostgreSQL 服务器是基于进程的(非线程)。每个数据库会话连接到单个PostgreSQL 操作系统 (OS)进程。多个会话由操作系统自动分布在所有可用的 CPU 上。操作系统还使用 CPU 来处理磁盘 I/O 和运行其他非数据库任务。客户端应用程序可以使用线程,每个线程都连接到一个单独的数据库进程。

由于9.6版本,部分某些查询可以并行运行,在单独的操作系统进程,允许使用多个CPU内核的。默认情况下,并行查询在版本 10 (max_parallel_workers_per_gather) 中启用,在未来版本中预计会增加并行性。

  • 无法相信在这个现代时代,设计会倾向于重负载进程上下文切换来实现多任务处理,而不是使用轻量级高性能多线程。谢谢你的澄清。这解释了为什么当我们根据一些明显不好的建议切换到 Postgres 时,我们的系统现在会承受负载。 (2认同)

Rob*_*kan 42

PostgreSQL 9.6+以后,将开始看到 Parallel-Query 最终出现在 PostgreSQL 中。

例如,像并行扫描/并行连接/并行聚合这样的概念现在已经被引入,很快就会有更多。

真正令人兴奋的是,在某些情况下有报告证实near-linear speed-up了这一点,这令人印象深刻!


小智 9

不,但有一个解决方法。:)

我找到了 parsel (parallel select) PL/pgSQL function,它根据主键拆分您的查询,然后通过 dblink 扩展连接到数据库并等待所有子查询。

作者还写了一篇关于这个功能的文章