Има само няколко неща, които ще помогнат с тази заявка:
-
Действителното сканиране изглежда не е проблемът (отне 42 секунди), но ако таблицата можеше да се запази в RAM, може да е по-бързо.
-
Вашият основен проблем е сортирането, което PostgreSQL вече паралелизира.
Има няколко неща, които можете да настроите:
-
Увеличете
work_mem
колкото е възможно повече, което ще направи сортирането по-бързо. -
Увеличете
max_worker_processes
(това ще изисква рестартиране),max_parallel_workers
иmax_parallel_workers_per_gather
така че повече ядра да могат да се използват за заявката.PostgreSQL има вътрешна логика за изчисляване на максималния брой паралелни работници, които е готов да използва за таблица:той ще вземе предвид колкото се може повече паралелни работници
дневник3 (размер на таблицата /
min_parallel_table_scan_size
)Можете да го принудите да използва повече процеси от това с:
ALTER TABLE ohlcv SET (parallel_workers = 20);
Но
max_parallel_workers
все още е горната граница.
-
Ако в таблицата няма изтривания и актуализации и данните се вмъкват в ред на сортиране, можете да се разминете просто с пропускането на ORDER BY
клауза, при условие че сте задали synchronize_seqscans = off
.