EXPLAIN ANALYZE là công cụ chẩn đoán hiệu năng cốt lõi — đọc plan từ trong ra ngoài, so sánh estimated vs actual rows, tìm Seq Scan trên bảng lớn và chênh lệch rows lớn (cần ANALYZE).
- EXPLAIN hiển thị execution plan mà planner dự định dùng mà không chạy query.
- EXPLAIN ANALYZE thực sự chạy query và so sánh estimated vs actual — dùng trên production cẩn thận với DML.
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)cho thêm buffer hit/miss info. - Đọc plan từ trong ra ngoài, từ dưới lên trên — node trong cùng chạy trước.
- Cost:
(startup_cost..total_cost)là planner estimate, không phải milliseconds — dùng để so sánh tương đối. - Actual time:
(actual time=0.043..1.2 rows=100). - Plan nodes quan trọng: Seq Scan — đọc toàn bộ table, tốt cho large % of rows hoặc small tables; Index Scan — dùng index rồi fetch table rows (random I/O); Index Only Scan — chỉ đọc index, không cần table (covering index, rất nhanh); Bitmap Index Scan + Bitmap Heap Scan — batch random reads thành sequential, tốt cho medium % of rows; Hash Join — build hash table từ smaller relation, probe với larger; Nested Loop — tốt khi outer là nhỏ và inner có index; Merge Join — tốt khi cả hai đã sorted.
- Red flags: estimated rows vs actual rows chênh lệch lớn (stale statistics →
ANALYZE table); Seq Scan trên bảng lớn trong WHERE condition → thiếu index; high Buffers read → data không trong cache.