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