← Tất cả bài viết

Đọ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 query
  • EXPLAIN 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.