Existem apenas algumas coisas que ajudarão com essa consulta:
-
A varredura real não parece ser o problema (levou 42 segundos), mas se a tabela pudesse ser mantida na RAM, poderia ser mais rápida.
-
Seu principal problema é a ordenação, que o PostgreSQL já paraleliza.
Existem algumas coisas que você pode ajustar:
-
Aumentework_mem
tanto quanto possível, o que tornará a classificação mais rápida.
-
Aumentemax_worker_processes
(isso exigirá uma reinicialização),max_parallel_workers
emax_parallel_workers_per_gather
para que mais núcleos possam ser usados para a consulta.
O PostgreSQL tem uma lógica interna para calcular o número máximo de trabalhadores paralelos que está pronto para usar em uma tabela:considerará tantos trabalhadores paralelos quantos
log3 (tamanho da tabela /min_parallel_table_scan_size
)
Você pode forçá-lo a usar mais processos do que isso com:
ALTER TABLE ohlcv SET (parallel_workers = 20);
Masmax_parallel_workers
ainda é o limite superior.
-
Se não houver exclusões e atualizações na tabela e os dados forem inseridos em ordem de classificação, você poderá simplesmente omitir o
ORDER BY
cláusula, desde que você defina synchronize_seqscans = off
.