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


57

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

Ответы:


49

Нет, для версий PostgreSQL до v9.6. Пожалуйста, смотрите FAQ по PostgreSQL : Как PostgreSQL использует ресурсы процессора?

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

Начиная с версии 9.6, части некоторых запросов могут выполняться параллельно, в отдельных процессах операционной системы, что позволяет использовать несколько процессорных ядер. Параллельные запросы по умолчанию включены в версии 10 (max_parallel_workers_per_gather), а в будущих выпусках ожидается дополнительный параллелизм.


38

Начиная с PostgreSQL версии 9.6 и выше, Parallel-Query наконец-то появится на PostgreSQL.

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

Что действительно захватывающе, так это то, что в некоторых случаях есть сообщения, подтверждающие near-linear speed-up, что довольно впечатляет!


8

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

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

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

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


3

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.