Может ли один запрос PostgreSQL использовать несколько ядер?

В последних версиях PostgreSQL (по состоянию на декабрь 2013 года) мы можем поделиться запросом между двумя или более ядрами, чтобы получить повышение производительности? Или мы должны получать более быстрые ядра?

48 голосов | спросил ALH 14 SatEurope/Moscow2013-12-14T18:13:46+04:00Europe/Moscow12bEurope/MoscowSat, 14 Dec 2013 18:13:46 +0400 2013, 18:13:46

4 ответа


43

Нет, для версий PostgreSQL до версии 9.6. См. Часто задаваемые вопросы по PostgresSQL : Как PostgreSQL использует ресурсы ЦП?

  

Сервер PostgreSQL основан на процессах (не в потоке) и использует один   процесс операционной системы на сеанс базы данных. Единая база данных   сеанс (соединение) не может использовать более одного ЦП. Конечно,   несколько сеансов автоматически распространяются на все доступные процессоры   вашей операционной системой. Клиентские приложения могут легко использовать потоки   и создавать несколько подключений к базе данных из каждого потока.

     

Один сложный и интенсивный запрос ЦП не может использовать больше, чем   один процессор для обработки запроса. ОС может все еще быть в состоянии   использовать другие для дискового ввода-вывода и т. д., но вы не увидите большой выгоды от   более одного запасного ядра.

ответил Jayadevan 15 SunEurope/Moscow2013-12-15T10:15:44+04:00Europe/Moscow12bEurope/MoscowSun, 15 Dec 2013 10:15:44 +0400 2013, 10:15:44
32

PostgreSQL 9.6 + , начнет видеть, что Parallel-Query, наконец, подходит к PostgreSQL.

Например, Такие понятия, как Параллельное сканирование / Параллельное соединение / Параллельные агрегаты теперь уже запекаются, и скоро все будет в порядке.

Что действительно интересно, так это отчеты , подтверждающие почти линейное ускорение в некоторых случаях, что довольно впечатляет!

ответил Robins Tharakan 24 MaramThu, 24 Mar 2016 05:35:30 +03002016-03-24T05:35:30+03:0005 2016, 05:35:30
7

Нет, но есть обходной путь. :)

Я обнаружил функцию plsel (parallel select) plpgsql, которая разбивает ваш запрос на основе первичного ключа, затем соединяется с базой данных через расширение dblink и ждет всех подзапросов.

https://gist.github.com/mjgleaso/8031067

Автор также написал статью об этой функции: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html

ответил Evgen Bodunov 14 Jpm1000000pmWed, 14 Jan 2015 21:11:55 +030015 2015, 21:11:55
1

Нет. Каждое соединение создает отдельный процесс на сервере.

Вы можете «эмулировать» некоторый параллелизм с помощью многопроцессорного процедурного языка, такого как pljava. Создайте java-процедуру (функцию), которая запускает несколько потоков и создает результат с использованием нескольких рабочих. Бэкэнд синхронизирован, поэтому каждый рабочий может обновить выход асинхронным.

Java имеет хорошую поддержку для координации /сотрудничества потоков.

В качестве примеров это было бы хорошо для интенсивных операций ЦП или операций с длиной сети.

ответил cavila 31 Maypm14 2014, 19:19:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132