Nguyên nhân gây ra sự chậm chạp là do ước tính số lượng hàng không hợp lệ khiến PostgreSQL chọn một phép nối vòng lặp lồng nhau. Hầu như tất cả thời gian của bạn đều dành cho việc quét chỉ mục trên hfj_res_link
, được lặp lại 1113 lần.
Nỗ lực đầu tiên của tôi là ANALYZE hfj_spidx_date
và xem liệu điều đó có giúp ích gì không. Nếu có, hãy đảm bảo rằng tự động phân tích xử lý bảng đó thường xuyên hơn.
Nỗ lực tiếp theo sẽ là
SET default_statistics_target = 1000;
rồi đến ANALYZE
như trên. Nếu điều đó hữu ích, hãy sử dụng ALTER TABLE
để tăng STATISTICS
trên hash_identity
và sp_value_high
cột.
Nếu điều đó cũng không giúp được gì và bạn có phiên bản gần đây của PostgreSQL, bạn có thể thử thống kê mở rộng :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Sau đó, ANALYZE
bảng một lần nữa và xem điều đó có hữu ích không.
Nếu tất cả những điều đó không hữu ích và bạn không thể nhận được ước tính chính xác, bạn phải thử một góc độ khác:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Điều đó sẽ tăng tốc độ quét chỉ mục đáng kể và cung cấp cho bạn thời gian phản hồi tốt.
Cuối cùng, nếu không điều nào ở trên có bất kỳ tác dụng nào, bạn có thể sử dụng biện pháp cruse về việc không cho phép các phép nối vòng lặp lồng nhau cho truy vấn này:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;