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:

Ảnh chụp mã SQL nền tối các định dạng EXPLAIN và công cụ vẽ kế hoạch. Mặc định là TEXT dễ đọc bằng mắt nhưng còn 3 định dạng máy đọc được. EXPLAIN FORMAT TEXT SELECT cây thụt lề quen thuộc. EXPLAIN FORMAT JSON SELECT cho công cụ hoặc script phân tích. EXPLAIN FORMAT YAML SELECT như JSON gọn hơn cho người. EXPLAIN FORMAT XML SELECT. Kèm ANALYZE cộng BUFFERS để có cả số thực cộng cache trong JSON, EXPLAIN ANALYZE BUFFERS FORMAT JSON SELECT. JSON có mọi trường được đặt tên dán vào công cụ để vẽ thành sơ đồ. explain.dalibo.com PEV2 cây màu tô đỏ node chậm cảnh báo lệch rows. explain.depesz.com bảng có phần trăm tô nóng node tốn nhiều thời gian. pgMustard phân tích cộng gợi ý tối ưu cụ thể có phí

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:

Ảnh chụp output EXPLAIN ANALYZE BUFFERS FORMAT JSON thật nền tối trích. Mảng mở một object Plan. Node Type Aggregate Strategy Hashed. Total Cost 52119.15 Plan Rows 50. Actual Total Time 211.280 Actual Rows 10. Shared Hit Blocks 22176 Shared Read Blocks 19999. Plans mảng lồng một object Node Type Hash Join Join Type Inner. Plans mảng lồng tiếp gồm object Node Type Index Scan Actual Rows 1000000 và object Node Type Hash. Chú thích mọi thứ bài trước phải đọc bằng mắt Node Type Total Cost Actual Rows Shared Hit Read Blocks giờ là trường có tên máy phân tích được. Dán khối JSON này vào explain.dalibo.com sẽ ra sơ đồ cây node chậm tô đỏ

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 Rows vs Plan Rows để tự phát hiện node ước lượng lệch, hay gom Shared 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ề

  1. EXPLAIN (FORMAT JSON) cho ra dữ liệu có trường tên (Node Type, Actual Rows, Shared Read Blocks, cây con trong Plans) thay vì text thụt lề — máy đọc và phân tích được.
  2. 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.
  3. 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.