Đọc EXPLAIN ANALYZE trong PostgreSQL để tối ưu query
22/07/2026
Khi một query chậm, đừng đoán mò. EXPLAIN ANALYZE cho bạn xem chính xác PostgreSQL thực thi thế nào và tốn thời gian ở đâu.
EXPLAIN vs EXPLAIN ANALYZE
EXPLAIN: chỉ hiển thị kế hoạch dự kiến, không chạy queryEXPLAIN ANALYZE: chạy thật và báo thời gian thực tế — cẩn thận với câu lệnh ghi (bọc trong transaction rồi ROLLBACK)
Các nút thường gặp
- Seq Scan: quét tuần tự cả bảng — bình thường với bảng nhỏ, đáng ngờ với bảng lớn khi có điều kiện lọc
- Index Scan / Index Only Scan: dùng index — thường là điều bạn muốn
- Nested Loop / Hash Join / Merge Join: các chiến lược ghép bảng khác nhau
Con số cần đọc
Chú ý rows dự kiến so với actual rows: lệch lớn nghĩa là thống kê (statistics) lỗi thời — chạy ANALYZE để cập nhật. actual time cho thấy nút nào ngốn thời gian thật.
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42;
-- Seq Scan trên bảng 1 triệu dòng + WHERE có tính lọc
-- => tín hiệu cần thêm index trên user_id
Quy trình tối ưu: chạy EXPLAIN ANALYZE → tìm nút tốn thời gian → thêm index/viết lại query → đo lại.
👉 Dùng thử công cụ liên quan trên dev-hub: SQL Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.