【发布时间】:2020-02-27 19:39:43
【问题描述】:
假设我的 PostgreSQL 数据库配置中有一个由 4 个并行工作器组成的池。我也有 2 节课。
在会话#1 中,SQL 当前正在执行,我的规划器随机选择为此查询启动 2 个工作器。
那么,在会话#2 中,我怎么知道我的工人池减少了 2?
【问题讨论】:
标签: sql postgresql query-optimization postgresql-12 postgresql-parallel-query
假设我的 PostgreSQL 数据库配置中有一个由 4 个并行工作器组成的池。我也有 2 节课。
在会话#1 中,SQL 当前正在执行,我的规划器随机选择为此查询启动 2 个工作器。
那么,在会话#2 中,我怎么知道我的工人池减少了 2?
【问题讨论】:
标签: sql postgresql query-optimization postgresql-12 postgresql-parallel-query
您可以计算并行工作器后端:
SELECT current_setting('max_parallel_workers')::integer AS max_workers,
count(*) AS active_workers
FROM pg_stat_activity
WHERE backend_type = 'parallel worker';
【讨论】:
EXPLAIN ANALYZE 验证了并行性。)在纯 Postgres 实例中测试相同,它按预期报告“并行工作者”。可能是因为 Aurora 在幕后以不同的方式实现并行。
在内部,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 的限制。 因此,并行查询可以用更少的 工人比计划的多,甚至根本没有工人。
【讨论】:
parallel_terminate_count - parallel_register_count 时,我会看到 2 个?我想这就是它所说的,但我并不真正理解parallel_terminate_count 的目的。
parallel_register_count - parallel_terminate_count - 它是注册(使用)并行工作人员的数量减去终止的数量。但这些是 C 代码中的内部变量。我不知道如何将它们公开给用户。 Laurenz 有一个更实用的方法。