pg_stat_statements là extension gom thống kê tích luỹ theo từng dạng truy vấn — nó chuẩn hoá tham số nên where id = 1 và where id = 2 được tính chung.
create extension if not exists pg_stat_statements;(Extension cần có trong shared_preload_libraries, tức phải restart một lần.)
Tìm truy vấn tốn tổng thời gian nhiều nhất — thường quan trọng hơn truy vấn chậm nhất:
select calls,
round(total_exec_time::numeric, 1) as total_ms,
round(mean_exec_time::numeric, 2) as mean_ms,
rows,
query
from pg_stat_statements
order by total_exec_time desc
limit 10;Cách đọc:
- total_exec_time cao, mean_exec_time thấp, calls rất lớn → truy vấn nhẹ nhưng gọi quá nhiều lần. Dấu hiệu điển hình của N+1; sửa ở tầng ứng dụng, không phải thêm index.
- mean_exec_time cao, calls thấp → một truy vấn nặng thật; đưa vào EXPLAIN ANALYZE để xem plan.
- rows / calls rất lớn → đang trả về nhiều dòng hơn cần thiết.
Sau khi tối ưu, select pg_stat_statements_reset(); để đo lại từ mốc sạch. Bổ sung log_min_duration_statement (vd 1000 ms) để bắt các truy vấn chậm kèm tham số thật, thứ mà pg_stat_statements đã chuẩn hoá đi mất.