Cây EXPLAIN dạng text ổn với truy vấn nhỏ, nhưng một truy vấn thật với năm bảng join, subquery, và sort lồng nhau sẽ cho ra một khối chữ thụt lề khiến bạn căng mắt lần từng dòng. Bài cuối của mô-đun nền tảng này giới thiệu một mẹo đơn giản làm việc đó dễ hơn nhiều: đổi định dạng đầu ra sang JSON, và để công cụ trực quan vẽ nó thành sơ đồ.
Bốn định dạng, cùng một kế hoạch
EXPLAIN nhận tuỳ chọn FORMAT. Mặc định là TEXT (cây thụt lề), nhưng còn JSON, YAML, XML — cùng thông tin, khác cách đóng gói:

Hình 1: EXPLAIN (FORMAT JSON) — thêm ANALYZE, BUFFERS để có cả số thực. TEXT cho người đọc nhanh; JSON/YAML/XML cho máy. Ba công cụ trực quan phổ biến ở dưới: explain.dalibo.com (PEV2), explain.depesz.com, và pgMustard — dán JSON vào là có sơ đồ, node chậm được tô đỏ, và cảnh báo khi ước lượng lệch thực tế.
JSON: mọi thứ thành trường có tên
Đây là JSON thật của một truy vấn join + group:

Hình 2: Thật. Cùng thông tin ở các bài trước — Node Type, Total Cost, Actual Rows, Shared Hit/Read Blocks — nhưng giờ mỗi thứ là một trường có tên, và cây con nằm trong mảng Plans lồng nhau. Con người đọc JSON này hơi rối, nhưng máy đọc được ngay — và đó là điều làm nên các công cụ trực quan.
Vì sao JSON hữu ích
- Cho công cụ trực quan. Dán JSON vào explain.dalibo.com, bạn có một sơ đồ cây: mỗi node là một hộp, kích thước/màu phản ánh thời gian, node ngốn nhất tô đỏ. Với truy vấn 20 node, nhìn sơ đồ nhanh hơn đọc text gấp bội.
- Cho tự động hoá. Vì có cấu trúc, bạn viết script trích
Actual RowsvsPlan Rowsđể tự phát hiện node ước lượng lệch, hay gomShared Read Blocksđể tìm node đọc đĩa nhiều — điều gần như bất khả thi với text. - Cho lưu trữ và so sánh. Lưu JSON kế hoạch trước/sau một thay đổi rồi diff bằng công cụ để thấy chính xác cái gì đổi.
Ba công cụ đáng biết
- explain.dalibo.com (PEV2) — mã nguồn mở, dán JSON (hoặc text), cho cây màu, tô đỏ node chậm, đánh dấu node có ước lượng lệch. Chạy hoàn toàn trong trình duyệt (không gửi dữ liệu đi đâu) — an toàn để dán kế hoạch production.
- explain.depesz.com — cổ điển, dán text
EXPLAIN ANALYZE, cho bảng với cột phần trăm thời gian, tô nóng dòng tốn nhiều — rất nhanh để tìm điểm nóng. - pgMustard — thương mại, không chỉ vẽ mà còn gợi ý cụ thể ("node này thiếu index, thử thêm...") kèm chấm điểm.
Một lưu ý bảo mật: text EXPLAIN (không ANALYZE) không lộ dữ liệu, nhưng kế hoạch có thể chứa giá trị tham số trong điều kiện lọc. Dùng công cụ chạy trong trình duyệt (như PEV2) nếu kế hoạch nhạy cảm, tránh dán lên dịch vụ gửi dữ liệu về máy chủ.
Ba ý mang về
EXPLAIN (FORMAT JSON)cho ra dữ liệu có trường tên (Node Type,Actual Rows,Shared Read Blocks, cây con trongPlans) thay vì text thụt lề — máy đọc và phân tích được.- Dán JSON vào công cụ trực quan (explain.dalibo.com/PEV2, explain.depesz.com, pgMustard) để có sơ đồ cây tô đỏ node chậm — nhanh hơn nhiều khi truy vấn phức tạp.
- JSON còn cho tự động hoá và so sánh: script tìm node ước lượng lệch, diff kế hoạch trước/sau. Cẩn thận dữ liệu nhạy cảm — ưu tiên công cụ chạy trong trình duyệt.
Hết mô-đun nền tảng: giờ bạn đã có trọn bộ công cụ để đo — EXPLAIN, ANALYZE, BUFFERS, cost model, pg_stat_statements, log truy vấn chậm, auto_explain, và định dạng JSON. Từ đây ta bước vào phần đông đảo nhất của tối ưu: index. Phần sau mở đầu bằng cấu trúc bên trong của B-tree index — vì sao nó cho tìm kiếm nhanh cỡ logarit, và điều đó nghĩa gì với mọi quyết định đánh index về sau.