Một số vấn đề nổi bật:
Trước tiên, hãy xem xét nâng cấp lên phiên bản Postgres hiện tại . Tại thời điểm viết bài, đó là trang 9.6 hoặc trang 10 (hiện đang là phiên bản beta). Kể từ trang 9.4, đã có nhiều cải tiến cho chỉ mục GIN, mô-đun bổ sung pg_trgm và dữ liệu lớn nói chung.
Tiếp theo, bạn cần thêm nhiều RAM , cụ thể là work_mem
cao hơn cài đặt. Tôi có thể biết từ dòng này trong EXPLAIN
đầu ra:
Heap Blocks: exact=7625 lossy=223807
"mất mát" thông tin chi tiết về Quét đống bitmap (với các con số cụ thể của bạn) cho thấy sự thiếu hụt đáng kể work_mem
. Postgres chỉ thu thập địa chỉ khối trong quá trình quét chỉ mục bitmap thay vì con trỏ hàng vì điều đó dự kiến sẽ nhanh hơn với work_mem
thấp của bạn cài đặt (không thể giữ địa chỉ chính xác trong RAM). Nhiều hàng không đủ điều kiện khác phải được lọc trong Quét đống bitmap sau cách này. Câu trả lời liên quan này có chi tiết:
Nhưng không đặt work_mem
quá cao mà không xem xét toàn bộ tình hình:
Có thể có các vấn đề khác, chẳng hạn như chỉ mục hoặc bảng cồng kềnh hoặc nhiều nút cổ chai về cấu hình. Nhưng nếu bạn chỉ sửa hai mục này, truy vấn sẽ nhiều nhanh hơn rồi.
Ngoài ra, bạn có thực sự cần truy xuất tất cả 40k hàng trong ví dụ này không? Bạn có thể muốn thêm một LIMIT
nhỏ vào truy vấn và đặt nó thành tìm kiếm "láng giềng gần nhất" - trong trường hợp đó, chỉ mục GiST là lựa chọn tốt hơn sau cùng, bởi vì that được cho là nhanh hơn với chỉ số GiST. Ví dụ: