Phân tích hiệu năng · EXPLAIN ANALYZE
Đọc cây plan từ dưới lên: nút lá chạy trước, dữ liệu đi lên nút cha
Cách đọc một cây plan của PostgreSQL
Cây plan của truy vấn doanh thu 2026 theo thành phố trên perf.orders và perf.customers: Seq Scan customers đưa 100.000 dòng vào Hash; Seq Scan orders lọc còn 174.865 dòng (bỏ 825.135) rồi dò vào bảng băm ở Hash Join; HashAggregate gom thành 10 thành phố; Sort xếp theo doanh thu. Mỗi nút có số dòng ước lượng và thực tế; thời gian của nút cha đã gồm nút con, tổng 108 ms, nút tốn nhất là Seq Scan orders.
SELECT c.city, SUM(o.total_amount) FROM perf.orders o JOIN perf.customers c … GROUP BY c.city ORDER BY 2 DESC
CÂY PLAN · EXPLAIN ANALYZE
10 NHÓM
174.865 DÒNG
100.000 DÒNG
Sort
Sort Key: doanh_thu DESC
rows 10 / 10 · xong 108,0 ms
6
HashAggregate
Group Key: c.city
rows 10 / 10 · xong 108,0 ms
5
Hash Join
rows 172364 / 174865
xong 87,9 ms
4
Seq Scan on orders o
rows 172364 / 174865
bỏ 825135 dòng · 41,6 ms
3
Hash
100000 khách · 5790kB
xong 16,4 ms
2
Seq Scan on customers c
rows 100000 / 100000
xong 6,1 ms
1
CÁCH ĐỌC
1
Từ dưới lên, từ trong ra
Nút thụt sâu nhất chạy trước
(số 1, 2, 3), dữ liệu đi lên nút cha.
Hash Join cần hai con: bảng băm
(Hash) và các dòng để dò.
2
rows: ước lượng / thực tế
rows=172364 là ước lượng,
actual rows=174865 là thực tế.
Lệch hàng chục lần thì planner
dễ chọn sai cách chạy.
3
Thời gian cộng dồn lên trên
Nút cha đã gồm thời gian nút con:
108,0 ms ở Sort là cả cây.
Tìm chỗ thời gian tăng vọt: ở đây
là Seq Scan on orders.
Số đo trên máy tác giả, máy bạn sẽ khác.
© tiennhm