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_memtanto quanto possível, o que tornará a classificação mais rápida.
-
Aumentemax_worker_processes(isso exigirá uma reinicialização),max_parallel_workersemax_parallel_workers_per_gatherpara 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_workersainda é 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 .