了解 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_count
和 parallel_terminate_count
的两个变量跟踪有多少并行工作程序处于活动状态。两者的区别在于活动并行工作者的数量。 See comment in in the source code.
在注册新的并行工作器之前,会根据max_parallel_workers
设置in the source code here 检查此编号。
很遗憾,我不知道有任何直接的方式可以将这些信息暴露给用户。
您将在查询计划中看到用尽限制的影响。您可以在通常并行化的大表上尝试 EXPLAIN ANALYZE
和 SELECT
查询。您会看到使用的工人少于计划的工人。 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 并行查询的会话中工作池中剩余多少并行工作人员?的主要内容,如果未能解决你的问题,请参考以下文章