Чи може один запит PostgreSQL використовувати декілька ядер?


56

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

Відповіді:


48

Ні, для версій PostgreSQL до версії 9.6. Будь ласка, ознайомтесь із питаннями поширених питань PostgreSQL : Як PostgreSQL використовує ресурси процесора?

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

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


37

PostgreSQL 9.6 і більше, починає бачити паралельний запит, нарешті, до 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.