1

我正在尝试相同的查询

select column_1, count(1)
from table
group by 1
order by 1 desc

使用几个前端工具,我得到了非常不同的结果。(我多次运行查询以避免异常或兑现问题)我一直认为它取决于服务器而不是客户端工具。

PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
max_parallel_workers = 8
max_parallel_workers_per_gather = 4

首先使用 pgAdmin3 LTS 1.23

查询以 4 个线程并行运行,并在 12 秒内完成

第二次使用 DbVisualizer 10.0.21

查询仅在单线程中运行并在 70 秒内完成

(是的,我用 show 命令检查了它,并行设置如上所述)

第三个是我的 Navicat 同事

查询以 4 个线程并行运行,并在 30 秒内完成

那么谁来决定如何处理服务器或客户端的查询呢?

编辑:

问题似乎出在 DbVisualizer 上,奇怪的是,如果我只运行查询,它不会并行化,但是当使用解释分析选项时它确实如此,我在服务器上检查了这一点以确保,即屏幕截图

在此处输入图像描述

这是来自 pgAdmin 的解释分析

https://explain.depesz.com/s/tP8Pi

这是 DbVisualizer 的执行计划:

https://explain.depesz.com/s/RSWw

4

2 回答 2

0

我只能猜测。

  • 一种可能性是 DbVisualizer 正在使用游标运行查询。这将阻止使用并行查询。

  • 另一种可能是事务隔离级别是SERIALIZABLE. 这具有相同的效果。

您可以在文档中查看并行查询的限制列表。

于 2019-09-19T14:21:38.373 回答
0

我已联系 DbVis 支持,我们发现了问题。它在 JDBC 驱动程序中。

以下是更多细节:

在测试过程中,我们注意到使用 JDBC 时无法触发并行查询。通过 PSQL 执行的查询显示计划和执行的并行查询执行(例如:“Workers Planned: 2, Workers Launched: 2”。但是,通过 JDBC 运行相同的查询显示查询是并行计划的,但不是并行执行的. 典型输出是:“Workers Planned: 2, Workers Launched: 0”。查询计划并行执行,但随后在单线程中执行。我们仅在通过 JDBC 时看到此行为。

https://github.com/pgjdbc/pgjdbc/issues/1246

DbVisualizer 的解决方案是更改Max Rows

设置 Max Rows = -1,查询并行运行
设置 Max Rows > 0,查询按顺序运行

于 2019-09-24T08:04:19.743 回答