Advertisement

Hiểu và đọc Execution Plan SQL Server để tối ưu hệ thống ERP bảng dữ liệu lớn

 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

SET STATISTICS IO ON SET STATISTICS TIME ON

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

JoinKhi nào tốtKhi nào nguy hiểm
Nested LoopÍt dữ liệuNhiều dòng
Hash MatchDữ liệu lớnRAM yếu
Merge JoinDữ 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:

Estimated Rows: 100 Actual Rows: 1,000,000

❌ 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

  1. Xem WHERE
  2. Xem JOIN
  3. Xem SELECT
  4. Tạo index theo thứ tự đó

Ví dụ:

WHERE NgayCong BETWEEN @TuNgay AND @DenNgay AND MaNhanVien = @MaNV

👉 Index đúng:

(NgayCong, MaNhanVien) INCLUDE (...)

🔹 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.







Post a Comment

0 Comments