Postgres,查询性能取决于前端工具吗?

Postgres, is query performance depending on front-end tool?

我正在尝试相同的查询

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 上,st运行gely 如果我只是 运行 查询它不会并行化但是当使用解释分析选项时它会并行化,我正在服务器上检查它以确定,即屏幕截图

这里是 pgAdmin 的解释分析

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

这是来自 DbVisualizer 的执行计划:

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

我只能猜测。

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

  • 另一种可能是事务隔离级别是SERIALIZABLE。效果一样。

您可以看到并行查询的限制列表in the documentation

我联系了 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

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