Chỉ có một số điều sẽ hữu ích với truy vấn này:
-
Quá trình quét thực tế dường như không thành vấn đề (mất 42 giây), nhưng nếu bảng có thể được giữ trong RAM thì có thể nhanh hơn.
-
Vấn đề chính của bạn là sắp xếp, PostgreSQL đã song song hóa.
Có một số điều bạn có thể điều chỉnh:
-
Tăng
work_mem
càng nhiều càng tốt, điều này sẽ làm cho việc sắp xếp nhanh hơn. -
Tăng
max_worker_processes
(điều này sẽ yêu cầu khởi động lại),max_parallel_workers
vàmax_parallel_workers_per_gather
để có thể sử dụng nhiều lõi hơn cho truy vấn.PostgreSQL có một logic nội bộ để tính toán số lượng công nhân song song tối đa mà nó sẵn sàng sử dụng cho một bảng:nó sẽ xem xét số lượng công nhân song song như
nhật ký 3 (kích thước bảng /
min_parallel_table_scan_size
)Bạn có thể buộc nó sử dụng nhiều quy trình hơn thế với:
ALTER TABLE ohlcv SET (parallel_workers = 20);
Nhưng
max_parallel_workers
vẫn là giới hạn trên.
-
Nếu không có xóa và cập nhật nào trên bảng và dữ liệu được chèn theo thứ tự sắp xếp, bạn có thể loại bỏ chỉ cần bỏ qua ORDER BY
, với điều kiện bạn đặt synchronize_seqscans = off
.