Greenplum Database Bài học 28: Đọc hiểu EXPLAIN và EXPLAIN ANALYZE trong Greenplum: Những điểm khác biệt hoàn toàn so với PostgreSQL
Ở Bài học 27, chúng ta đã diện kiến bộ siêu trí tuệ GPORCA — bộ tối ưu hóa truy vấn chuyên biệt cho kiến trúc MPP của Greenplum. Tuy nhiên, làm sao để bạn biết GPORCA đang thực sự nghĩ gì và lên kế hoạch chạy câu lệnh SQL của bạn ra sao?
Câu trả lời nằm ở lệnh EXPLAIN và EXPLAIN ANALYZE.
Nếu bạn đã quen thuộc với việc đọc lệnh EXPLAIN trong PostgreSQL đơn lẻ, khi bước sang Greenplum, bạn sẽ thấy bản kế hoạch thực thi (Query Plan) hoàn toàn khác biệt với những thuật ngữ mới như Slices, Motion, Gang. Trong bài học này, chúng ta sẽ học cách đọc hiểu tường tận các bản vẽ kỹ thuật này để bắt "bệnh" cho mọi câu lệnh SQL chậm.
1. Phân biệt EXPLAIN và EXPLAIN ANALYZE
Trước khi mổ xẻ nội dung bên trong, chúng ta cần phân định rõ hai công cụ:
-
EXPLAIN [SQL]: Chỉ yêu cầu GPORCA vẽ ra bản kế hoạch thực thi trên lý thuyết dựa vào bảng thống kê (Statistics) hiện tại. Câu lệnh không thực sự được chạy, nên trả về kết quả trong tích tắc. Dùng để kiểm tra xem hệ thống chọn đường đi nào. -
EXPLAIN ANALYZE [SQL]: Thực thi thật sự câu lệnh trên toàn bộ cụm, sau đó đo đạc chính xác thời gian thực tế (time), số dòng thực tế (rows) và lượng bộ nhớ tiêu thụ của từng bước.- ⚠️ Cảnh báo thực chiến: Hãy cẩn thận khi chạy
EXPLAIN ANALYZEtrên các câu lệnhUPDATE,DELETEhoặc các bảng Fact hàng tỷ dòng đang chạy trên môi trường Production, vì nó sẽ thực sự tác động và làm tốn tài nguyên hệ thống!
- ⚠️ Cảnh báo thực chiến: Hãy cẩn thận khi chạy
2. Giải phẫu cấu trúc một bản kế hoạch EXPLAIN trên Greenplum
Hãy nhìn vào cấu trúc một bản kế hoạch thực thi điển hình của Greenplum và cách đọc nó:
Plaintext
QUERY PLAN
--------------------------------------------------------------------------------------
Gather Motion 2:1 (slice1; segments: 2) (cost=0.00..431.00 rows=1 width=8)
-> Partial Aggregate (cost=0.00..431.00 rows=1 width=8)
-> Seq Scan on fact_orders (cost=0.00..431.00 rows=50000 width=16)
Optimizer: Pivotal Optimizer (GPORCA)
Nguyên tắc đọc bản kế hoạch: Đọc từ DƯỚI lên TRÊN
-
Bước dưới cùng (
Seq Scan): Các tiến trình Segment đồng loạt quét tuần tự bảngfact_orderstrên ổ cứng của riêng mình. -
Bước ở giữa (
Partial Aggregate): Mỗi Segment tự tính toán cộng dồn cục bộ trên tập dữ liệu của chính nó để giảm tải lượng dữ liệu phải truyền tải. -
Bước trên cùng (
Gather Motion): Dữ liệu sau khi tính nháp từ các Segment được gom qua mạng Interconnect đẩy về Master Node để ra kết quả cuối cùng.
3. Ba điểm khác biệt "Sống còn" so với PostgreSQL thuần
Khi chuyển từ PostgreSQL sang Greenplum, bạn sẽ thấy bản kế hoạch xuất hiện những khái niệm hoàn toàn mới mà Postgres thuần không bao giờ có:
3.1. Sự xuất hiện của các toán tử Motion (Di chuyển dữ liệu qua mạng)
Như chúng ta đã học ở Bài 5, đây là dấu hiệu đặc trưng của kiến trúc MPP. Trong bản kế hoạch EXPLAIN, bạn sẽ liên tục gặp các toán tử dịch chuyển dữ liệu:
-
Gather Motion N:1: Gom dữ liệu từ Segments về 1 Master. -
Redistribute Motion: Băm (Hash) lại dữ liệu và bắn chéo giữa các Segments để thực hiện phépJOIN. -
Broadcast Motion: Nhân bản dữ liệu từ 1 nơi gửi ra toàn bộ các Segments còn lại.(Nếu bạn nhìn thấy quá nhiềuRedistribute Motiontrong một câu lệnhJOIN, đó là dấu hiệu cho thấy khóa phân phốiDISTRIBUTED BYđang được thiết kế tồi!)
3.2. Khái niệm Slices (Lát cắt thực thi phân tán)
Trong một bản kế hoạch của Greenplum, bạn sẽ thấy các nhãn như (slice1), (slice2).
-
Một câu lệnh SQL phức tạp được GPORCA chia nhỏ thành nhiều phần độc lập gọi là các Slices.
-
Mỗi Slice đại diện cho một giai đoạn tính toán có thể chạy song song độc lập trên các Segment trước khi truyền kết quả sang Slice tiếp theo qua mạng Interconnect.
3.3. Khái niệm Gang (Nhóm tiến trình thực thi)
Khi chạy EXPLAIN ANALYZE, bạn sẽ thấy thuật ngữ Reader Gang hoặc Writer Gang.
-
Gang là tập hợp các tiến trình con (
QE - Query Executor) được sinh ra đồng thời trên các Segment Hosts để cùng thực hiện một Slice công việc. -
Reader Gang chuyên đọc dữ liệu, trong khi Writer Gang chuyên ghi dữ liệu xuống bảng đích (ví dụ trong các lệnh
INSERT INTO ... SELECT).
4. Cách đọc EXPLAIN ANALYZE để bắt bệnh câu lệnh chậm
Khi một câu lệnh SQL chạy lâu trên Production, việc chạy EXPLAIN ANALYZE sẽ giúp bạn soi thấy các "ung nhọt" hệ thống:
Plaintext
EXPLAIN ANALYZE SELECT * FROM fact_orders JOIN customers ON ...;
Hãy chú ý đến 3 chỉ số vàng:
-
Time (Thời gian thực tế): Nhìn xem bước nào (Step) tốn nhiều thời gian nhất (
costlý thuyết có thể đánh lừa, nhưng thời gian thực tế trongANALYZEthì không bao giờ nói dối). Nếu một bướcSeq Scantốn tới vài chục giây, bảng đó đang thiếu Index hoặc thiếu Partitioning. -
Rows (Số lượng dòng): So sánh giữa
rows=...(số dòng mà GPORCA ước tính) vàactual rows=...(số dòng thực tế xuất hiện). Nếu hai con số này lệch nhau hàng ngàn lần, điều đó có nghĩa là bảng của bạn đang bị thiếu thống kê (Out-of-date Statistics). GPORCA tính toán sai chi phí và chọn nhầm đường đi. (Khắc phục bằng cách chạy ngay lệnhANALYZE table_name;). -
Workmem / Spill to Disk: Nếu bạn thấy xuất hiện thông báo
Work_mem used: ... spilling to disk, điều đó có nghĩa là bộ nhớ RAM cấp cho câu lệnh (statement_mem) quá nhỏ, khiến dữ liệu phải tràn ra ổ cứng tạm thời — nguyên nhân hàng đầu làm sập hiệu năng hệ thống.
Tóm tắt Bài học 28
-
EXPLAINvẽ ra kế hoạch thực thi lý thuyết, trong khiEXPLAIN ANALYZEthực thi thật và đo đạc chính xác thời gian, số dòng thực tế của từng bước. -
Bản kế hoạch Greenplum khác biệt hoàn toàn so với PostgreSQL nhờ sự xuất hiện của các toán tử
Motion, các phân đoạnSlicesvà nhóm tiến trìnhGang. -
Phân tích sự chênh lệch giữa số dòng ước tính và số dòng thực tế giúp phát hiện lỗi thiếu thống kê dữ liệu, từ đó tối ưu hóa chiến lược Index và Partitioning.
Ở bài học tiếp theo (Bài học 29), chúng ta sẽ mổ xẻ chi tiết từng loại toán tử di chuyển dữ liệu qua mạng: Giải mã các toán tử dịch chuyển dữ liệu (Motion Operators): Broadcast Motion, Redistribute Motion và Gather Motion.
All rights reserved