Truy vấn này không tạo ra bất kỳ I / O đĩa nào - tất cả các khối đều được đọc từ bộ đệm được chia sẻ. Nhưng vì truy vấn đọc 73424 khối (khoảng 574 MB), nó sẽ tạo ra tải I / O đáng kể khi bảng không được lưu vào bộ nhớ đệm.
Nhưng có hai điều có thể được cải thiện.
-
Bạn có kết quả khớp khối mất mát trong quá trình quét đống. Điều đó có nghĩa là
work_mem
không đủ lớn để chứa một bitmap với một bit trên mỗi hàng trong bảng và thay vào đó, 26592 bit ánh xạ một khối bảng. Tất cả các hàng phải được kiểm tra lại và 86733 hàng bị loại bỏ, hầu hết trong số đó là dương tính giả từ các kết quả khớp khối bị mất.Nếu bạn tăng
work_mem
, một bitmap với một bit trên mỗi hàng trong bảng sẽ vừa với bộ nhớ và con số này sẽ thu nhỏ lại, làm giảm công việc trong quá trình quét đống. -
190108 hàng bị loại bỏ vì chúng không phù hợp với điều kiện bộ lọc bổ sung trong quá trình quét đống bitmap. Đây có lẽ là nơi mà hầu hết thời gian được sử dụng. Nếu bạn có thể giảm số tiền đó, bạn sẽ thắng.
Các chỉ mục lý tưởng cho truy vấn này sẽ là:
CREATE INDEX ON map_listing(transaction_type, la); CREATE INDEX ON map_listing(transaction_type, lo);
Nếu
transaction_type
không có tính chọn lọc cao (tức là hầu hết các hàng đều có giá trịSale
), bạn có thể bỏ qua cột đó.
CHỈNH SỬA:
Kiểm tra vmstat
và iostat
cho thấy cả CPU và hệ thống con I / O đang bị quá tải lớn:tất cả tài nguyên CPU được sử dụng cho I / O chờ và thời gian đánh cắp VM. Bạn cần một hệ thống I / O tốt hơn và một hệ thống máy chủ có nhiều tài nguyên CPU miễn phí hơn. Tăng migjt RAM làm giảm bớt sự cố I / O, nhưng chỉ đối với các lần đọc đĩa.