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

57

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

ALH
источник

Ответы:

49

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

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

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

Jayadevan
источник
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 имеет хорошую поддержку для координации потоков / сотрудничества.

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

cavila
источник