了解 PostgreSQL 并行查询的会话中工作池中剩余多少并行工作人员?

Posted

技术标签:

【中文标题】了解 PostgreSQL 并行查询的会话中工作池中剩余多少并行工作人员?【英文标题】:Understanding how many parallel workers remain from a worker pool across sessions for PostgreSQL parallel queries? 【发布时间】:2020-02-27 19:39:43 【问题描述】:

假设我的 PostgreSQL 数据库配置中有一个由 4 个并行工作器组成的池。我也有 2 节课。

在会话#1 中,SQL 当前正在执行,我的规划器随机选择为此查询启动 2 个工作器。

那么,在会话#2 中,我怎么知道我的工人池减少了 2?

【问题讨论】:

【参考方案1】:

您可以计算并行工作器后端:

SELECT current_setting('max_parallel_workers')::integer AS max_workers,
       count(*) AS active_workers
FROM pg_stat_activity
WHERE backend_type = 'parallel worker';

【讨论】:

假设一个 SQL 查询保留了 2 个并行工作者。在 SQL 查询执行完成之前,max_parallel_worker 变量会减少 2 吗?执行此操作的参数 - 如果它甚至存在的话 - 就是我正在寻找的。​​span> 没有参数。我没有阅读源代码;也许有一个全局变量可以从 C 函数访问,但肯定不能从 SQL 访问。查询有什么问题? 只需将我的查询返回的两个数字相减,即可得到结果。 我在 Postgres 10.7 Aurora 实例上对此进行了测试。有趣的是,它为并行工作人员报告了“后台工作人员”而不是“并行工作人员”。 (使用EXPLAIN ANALYZE 验证了并行性。)在纯 Postgres 实例中测试相同,它按预期报告“并行工作者”。可能是因为 Aurora 在幕后以不同的方式实现并行。 @ErwinBrandstetter 感谢您的收看。好吧,使用闭源 PostgreSQL 分叉有一定的缺点。【参考方案2】:

在内部,Postgres 使用名为 parallel_register_countparallel_terminate_count 的两个变量跟踪有多少并行工作程序处于活动状态。两者的区别在于活动并行工作者的数量。 See comment in in the source code.

在注册新的并行工作器之前,会根据max_parallel_workers 设置in the source code here 检查此编号。

很遗憾,我不知道有任何直接的方式可以将这些信息暴露给用户。

您将在查询计划中看到用尽限制的影响。您可以在通常并行化的大表上尝试 EXPLAIN ANALYZESELECT 查询。您会看到使用的工人少于计划的工人。 The manual:

任意时刻可以存在的后台worker总数 受max_worker_processes 和max_parallel_workers 的限制。 因此,并行查询可以用更少的 工人比计划的多,甚至根本没有工人。

【讨论】:

谢谢;这与我正在寻找的非常相似。只是为了澄清一下,如果我发出一个保留 2 个工作人员的查询,那么当我执行 parallel_terminate_count - parallel_register_count 时,我会看到 2 个?我想这就是它所说的,但我并不真正理解parallel_terminate_count 的目的。 @baceda9220:反转:parallel_register_count - parallel_terminate_count - 它是注册(使用)并行工作人员的数量减去终止的数量。但这些是 C 代码中的内部变量。我不知道如何将它们公开给用户。 Laurenz 有一个更实用的方法。

以上是关于了解 PostgreSQL 并行查询的会话中工作池中剩余多少并行工作人员?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL:如何在函数中并行运行查询?

使用 SPI 的 PostgreSQL 并行查询可能吗?

PostgreSQL CTE 的一般并行性

datastax 会话因大量并行查询而挂起

如何在 Python3.7 docker 容器中执行并行 PostgreSQL 查询?

PostgreSQL并行查询相关配置参数