Họ đang đo gì
Bạn có hệ thống hoá được việc gỡ rối không, hay chỉ thử từng thứ cho tới khi nhanh lên.
Trả lời ngắn~30 giây
Thứ tự mình dùng: đọc EXPLAIN (ANALYZE, BUFFERS) để biết thời gian nằm ở đâu; kiểm tra ước lượng của planner có khớp thực tế không (lệch nhiều nghĩa là thống kê cũ); xem có đang đọc nhiều hàng hơn cần thiết không; rồi mới tính tới index. Sau đó là những câu hỏi lớn hơn: có thể lấy ít dữ liệu hơn không, có thể tính sẵn không, có thật sự cần chạy lúc này không.
Bảng có 5,000,000 hàng, khoảng 55,556 trang. Mỗi ô dưới đây là một nhóm trang.
Giải thích sâu
Chỗ đọc kế hoạch cần biết nhìn cái gì. Con số quan trọng nhất không phải cost mà là chênh lệch giữa rows ước lượng và actual rows — lệch 100 lần nghĩa là planner đang ra quyết định dựa trên thông tin sai, và mọi index bạn thêm sau đó có thể vẫn không được dùng. Buffers cho biết lượng dữ liệu thật sự đọc, và đó là đại lượng tương quan chặt nhất với thời gian.
Có một loại vấn đề rất hay bị bỏ sót: truy vấn nhanh khi chạy tay nhưng chậm trong ứng dụng. Nguyên nhân thường là generic plan của prepared statement — Postgres sau năm lần thực thi sẽ chuyển sang một kế hoạch chung không phụ thuộc tham số, và với dữ liệu lệch thì kế hoạch chung đó tệ hơn hẳn. Kiểm tra bằng cách EXPLAIN chính prepared statement đó chứ không phải câu SQL đã thay tham số.
Ở bước “lấy ít dữ liệu hơn”, câu hỏi hay nhất là truy vấn này phục vụ màn hình nào. Rất thường thì nó SELECT * trên bảng có cột JSON lớn trong khi giao diện chỉ hiển thị ba trường; chỉ cần liệt kê đúng cột là lượng byte giảm mười lần và index-only scan trở nên khả thi. Đây là kiểu sửa vừa rẻ vừa hiệu quả nhất, và nó không cần thêm index nào.
Câu hỏi tiếp theo họ sẽ hỏi
?Materialized view khi nào hợp lý?
Khi truy vấn đắt, dữ liệu chấp nhận trễ, và nó được chạy nhiều lần hơn là được cập nhật — báo cáo tổng hợp là ví dụ điển hình. Cái giá là bạn phải quản lý việc làm mới, và REFRESH không có CONCURRENTLY thì khoá cả view trong lúc chạy.
Trả lời thế này là mất điểm
- Thêm index ngay khi thấy truy vấn chậm. Đôi khi đúng, nhưng nó là bước thứ tư chứ không phải bước đầu.
- Đo trên máy dev với 1.000 hàng. Kế hoạch thực thi thay đổi hoàn toàn theo kích thước dữ liệu.