Hướng dẫn đọc Execution Plan SQL Server từ cơ bản đến nâng cao, giúp tối ưu Stored Procedure, giảm IO, CPU và tăng tốc hệ thống ERP dữ liệu lớn.
Trong tất cả các kỹ năng tối ưu SQL Server, đọc Execution Plan là kỹ năng quan trọng nhất – nhưng cũng là kỹ năng bị bỏ qua nhiều nhất.
Rất nhiều lập trình viên ERP:
- Tối ưu bằng cách… thêm index ngẫu nhiên
- Query chậm thì đổ lỗi cho server
- Stored Procedure chạy lâu thì RECOMPILE vô tội vạ
👉 Nhưng nếu bạn đọc đúng Execution Plan, bạn sẽ:
- Biết SQL Server đang làm gì
- Biết vì sao query chậm
- Biết nên sửa ở đâu, không sửa mù
Bài viết này sẽ giúp bạn đọc Execution Plan như một DBA, nhưng theo góc nhìn lập trình ERP thực tế.
🔹 Execution Plan là gì – hiểu cho đúng
Execution Plan là kế hoạch thực thi mà SQL Server chọn để:
- Truy xuất dữ liệu
- JOIN bảng
- Sắp xếp
- Tính toán
👉 SQL Server không chạy SQL theo thứ tự bạn viết, mà theo Execution Plan.
Cùng một câu SQL – khác Execution Plan – tốc độ khác nhau hoàn toàn.
🔹 Các loại Execution Plan (cần biết)
1️⃣ Estimated Execution Plan
- Chỉ là ước lượng
- Không phản ánh dữ liệu thật
- Dùng khi chưa chạy query
👉 Không dùng để tối ưu ERP
2️⃣ Actual Execution Plan (BẮT BUỘC)
- Phản ánh dữ liệu thật
Thể hiện:
- Số dòng thực tế
- IO
- CPU
- Dùng để tối ưu query & SP
👉 ERP luôn phải dùng Actual Execution Plan
🔹 Bật Execution Plan đúng cách
Và:
- Include Actual Execution Plan (Ctrl + M)
👉 Không bật 2 cái này = tối ưu mù
🔹 Cách đọc Execution Plan – nguyên tắc sống còn
🔴 Quy tắc số 1: Đọc từ PHẢI sang TRÁI
- Bên phải: dữ liệu nguồn
- Bên trái: kết quả cuối
👉 90% người đọc sai hướng.
🔴 Quy tắc số 2: Quan tâm node tốn % cao nhất
- % cao ≠ chậm
- Nhưng là điểm nghi vấn đầu tiên
🔹 Các operator QUAN TRỌNG trong ERP
🔹 1️⃣ Table Scan / Clustered Index Scan (DẤU HIỆU NGUY HIỂM)
- SQL Server đọc toàn bộ bảng
- Với bảng vài triệu dòng → thảm họa
Nguyên nhân:
- Không có index phù hợp
- WHERE dùng hàm
- Kiểu dữ liệu không khớp
👉 Trong ERP, scan bảng lớn = lỗi thiết kế
🔹 2️⃣ Index Seek (THỨ BẠN MUỐN THẤY)
- SQL Server tìm đúng dữ liệu
- IO thấp
- Tốc độ nhanh
👉 Mục tiêu khi tối ưu:
Scan → Seek
🔹 3️⃣ Key Lookup – con dao hai lưỡi
Key Lookup không xấu, nhưng:
- Ít dòng → OK
- Nhiều dòng → CỰC CHẬM
Cách xử lý:
- Thêm
INCLUDE - Hoặc thiết kế lại index
🔹 4️⃣ Nested Loop / Hash Match / Merge Join
| Join | Khi nào tốt | Khi nào nguy hiểm |
|---|---|---|
| Nested Loop | Ít dữ liệu | Nhiều dòng |
| Hash Match | Dữ liệu lớn | RAM yếu |
| Merge Join | Dữ liệu đã sort | Ít index |
👉 ERP báo cáo lớn thường dùng Hash Match.
🔹 Estimated Rows vs Actual Rows – chỉ số VÀNG
👉 Đây là điểm quan trọng nhất khi đọc Execution Plan.
Nếu:
❌ SQL Server chọn plan sai.
Nguyên nhân:
- Statistic cũ
- Parameter sniffing
- WHERE không tối ưu
👉 Sai lệch càng lớn → hiệu năng càng tệ.
🔹 Parameter Sniffing nhìn từ Execution Plan
Dấu hiệu:
- Query chạy nhanh với ngày nhỏ
- Chạy chậm với ngày lớn
- Execution Plan giống nhau
👉 Execution Plan được cache cho dữ liệu nhỏ.
Cách xử lý:
OPTION (RECOMPILE)- Gán biến local
- Tách Stored Procedure
🔹 Execution Plan và Index – hiểu đúng để đánh chuẩn
❌ Sai lầm phổ biến
- Thấy scan → tạo index ngay
- Không xem WHERE / JOIN
✅ Cách làm đúng
- Xem WHERE
- Xem JOIN
- Xem SELECT
- Tạo index theo thứ tự đó
Ví dụ:
👉 Index đúng:
🔹 Execution Plan với Temp Table
Nếu thấy:
- Table Scan trên
#Temp - Nhưng bảng lớn
👉 Thiếu index cho temp table.
ERP dùng temp table phải đánh index, không ngoại lệ.
🔹 Case thực tế: Đọc Execution Plan cứu hệ thống ERP
Trước:
- SP lương chạy 70 giây
- Clustered Index Scan
- Estimated Rows ≠ Actual Rows
Phát hiện:
- WHERE dùng
YEAR(Ngay) - Statistic cũ
Sau:
- Viết lại WHERE
- Update statistic
- Thêm INCLUDE
👉 Kết quả:
70s → 4s
🔹 Những hiểu lầm tai hại về Execution Plan
❌ % cao nhất là chậm nhất
❌ Có index là nhanh
❌ Hash Match luôn xấu
❌ SQL Server tự tối ưu là đủ
👉 ERP không cho phép hiểu lầm.
🔹 Checklist đọc Execution Plan cho ERP
✅ Có scan bảng lớn không?
✅ Estimated ≠ Actual bao nhiêu?
✅ Có Key Lookup nhiều không?
✅ JOIN loại gì?
✅ Có dùng đúng index không?
🔹 Kết luận
Nếu bạn chỉ nhớ 1 điều duy nhất, hãy nhớ:
Execution Plan không nói dối.
SQL Server luôn cho bạn biết:
- Nó đang làm gì
- Vì sao chậm
- Bạn cần sửa ở đâu
Trong ERP:
Biết đọc Execution Plan = nắm quyền kiểm soát hệ thống.
🔹 FAQ
❓ Có nên tin 100% Execution Plan?
👉 Tin để phân tích, không tin mù.
❓ Bao lâu nên xem lại Execution Plan?
👉 Mỗi lần dữ liệu tăng mạnh hoặc thêm tính năng.
❓ DBA hay Dev nên đọc Execution Plan?
👉 Cả hai, nhưng Dev ERP là người cần nhất.

0 Comments
Hoan nghênh sự góp ý của bạn cho website!
- Nếu bạn không có các tài khoản để nhắn tin/bình luận bạn có thể chọn trong "Nhận xét với tư cách" với tài khoản "Ẩn danh" (Anonymous).
Cám ơn bạn đã đọc blog! Chúc bạn tìm được nhiều bài viết hay và hữu ích cho mình!