Hanya ada beberapa hal yang akan membantu kueri ini:
-
Pemindaian yang sebenarnya tampaknya tidak menjadi masalah (butuh 42 detik), tetapi jika tabel dapat disimpan dalam RAM, mungkin akan lebih cepat.
-
Masalah utama Anda adalah jenisnya, yang telah diparalelkan oleh PostgreSQL.
Ada beberapa hal yang dapat Anda sesuaikan:
-
Tingkatkan
work_mem
sebanyak mungkin, yang akan membuat pengurutan lebih cepat. -
Tingkatkan
max_worker_processes
(ini akan membutuhkan restart),max_parallel_workers
danmax_parallel_workers_per_gather
sehingga lebih banyak inti yang dapat digunakan untuk kueri.PostgreSQL memiliki logika internal untuk menghitung jumlah maksimum pekerja paralel yang siap digunakan untuk sebuah tabel:PostgreSQL akan mempertimbangkan pekerja paralel sebanyak
log3 (ukuran tabel /
min_parallel_table_scan_size
)Anda dapat memaksanya untuk menggunakan lebih banyak proses dari itu dengan:
ALTER TABLE ohlcv SET (parallel_workers = 20);
Tapi
max_parallel_workers
masih merupakan batas atas.
-
Jika tidak ada penghapusan dan pembaruan pada tabel, dan data dimasukkan dalam urutan pengurutan, Anda dapat menghapus ORDER BY
saja. klausa, asalkan Anda menyetel synchronize_seqscans = off
.