Postgres, производительность запросов зависит от внешнего интерфейса? - PullRequest
1 голос
/ 19 сентября 2019

Я пробовал один и тот же запрос

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 с

* 1012.* Второй с DbVisualizer 10.0.21

Запрос выполнялся только в одном потоке и завершался в течение 70 с

(и да, я проверил его с помощью команды show, и параллельные настройки были такими, как указановыше)

Третий мой коллега с запросом Navicat

выполнялся параллельно с 4 потоками и завершался в течение 30 с

Итак, кто принимает решение о том, как выполняется запрособработанный сервер или клиент?

РЕДАКТИРОВАТЬ:

Проблема, кажется, с DbVisualizer, странно, если я просто запускаю запрос, он не распараллеливается, но когда используется опция объяснения анализаэто доуs, я проверял это на сервере, чтобы быть уверенным, а именно: снимок экрана

enter image description here

А вот анализ объяснения из pgAdmin

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

Это план выполнения от DbVisualizer:

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

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я связался со службой поддержки 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 заключается в изменении Макс. Строк

Настройка Макс. Строк = -1, запрос выполняется параллельно
НастройкаМакс. Строк> 0, запрос выполняется последовательно

0 голосов
/ 19 сентября 2019

Я могу только догадываться.

  • Одна из возможностей состоит в том, что DbVisualizer выполняет запрос с помощью курсора.Это предотвратит использование параллельного запроса.

  • Другая возможность состоит в том, что уровень изоляции транзакции равен SERIALIZABLE.Это имеет тот же эффект.

Список ограничений для параллельного запроса можно посмотреть в документации .

...