Tìm hiểu các toán tử hay sử dụng trên Execution Plan trong SQL Server

Trong bài viết này Stanford giới thiệu đến các bạn học quản trị sql server làm việc với các toán tử thường gặp trên Execution Plan trong SQL Server, giúp hiểu rõ các xử lý của một câu lệnh truy vấn.

Execution plan là một bản hướng dẫn chi tiết những việc phải làm để hoàn thành một câu lệnh truy vấn. Khi bạn gửi một câu lệnh SELECT đến SQL Server, sẽ có nhiều cách thực hiện những công việc cần thiết để cho ra kết quả mong muốn và Query Optimizer chịu trách nhiệm cho việc chọn cách truy vấn thế nào cho phù hợp với những tham số đầu vào.


Dưới đây là ý nghĩa của từng toán tử trên Execution Plan mà bạn có thể thấy khi thực hiện một câu lệnh truy vấn trên SQL Server như sau:

Compute Scalar

Trong SQL Server, Compute Scalar là một operator (toán tử) trong execution plan (kế hoạch thực thi), dùng để tính toán một giá trị đơn giản từ các cột hoặc hằng số trong quá trình truy vấn.
Cụ thể, Compute Scalar thực hiện các phép tính như:
- Tính toán biểu thức (ví dụ: Price * Quantity)
- Áp dụng hàm (ví dụ: GETDATE(), ISNULL(), CONVERT())
- Tạo giá trị mới từ các cột hiện có
Ví dụ:
Giả sử bạn có truy vấn:

SELECT FirstName + ' ' + LastName AS FullName FROM Employees;
Trong execution plan, SQL Server sẽ sử dụng Compute Scalar để thực hiện phép nối chuỗi (+) giữa FirstName và LastName.

Hash Match

Trong SQL Server, Hash Match là một operator trong execution plan dùng để thực hiện các thao tác như:

- Join (kết nối bảng)
- Aggregate (tổng hợp dữ liệu)
- Union
Intersect
- Except
Cách hoạt động của Hash Match:
Hash Match hoạt động theo 2 giai đoạn chính:
1. Build phase:

- SQL Server chọn một bảng nhỏ hơn (thường là bảng bên trái trong join).
- Tạo một hash table từ dữ liệu của bảng này dựa trên cột dùng để join hoặc group.
2. Probe phase:
- Duyệt qua bảng còn lại (bảng lớn hơn).
- Với mỗi dòng, SQL Server tính toán giá trị hash và tìm trong hash table để xác định các dòng khớp.
Khi nào SQL Server dùng Hash Match ?
- Khi không có index phù hợp cho Nested Loops hoặc Merge Join.
- Khi làm việc với dữ liệu lớn và cần xử lý nhanh.
- Khi thực hiện hash-based aggregation (ví dụ: GROUP BY mà không có index hỗ trợ).

Ví dụ:

SELECT *
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID;
Nếu không có index trên CustomerID, SQL Server có thể dùng Hash Match Join để kết nối hai bảng.

Filter

Trong SQL Server, Filter là một operator trong execution plan dùng để lọc các hàng (rows) dựa trên một điều kiện cụ thể. Nó tương đương với việc áp dụng một mệnh đề WHERE hoặc CASE trong truy vấn SQL.

Cách hoạt động của Filter:
- Filter nhận dữ liệu từ một operator khác (ví dụ: Table Scan, Index Seek, Join, v.v.).
- Sau đó, nó áp dụng điều kiện logic (predicate) để giữ lại các hàng thỏa mãn điều kiện và loại bỏ phần còn lại.
Ví dụ:

SELECT * FROM Products WHERE Price > 100;
Trong execution plan, bạn có thể thấy:
- Một Table Scan hoặc Index Seek để lấy dữ liệu.
- Một Filter operator để áp dụng điều kiện Price > 100.

Sort

Trong SQL Server, Sort là một operator trong execution plan dùng để sắp xếp dữ liệu theo một hoặc nhiều cột, thường là để phục vụ cho các thao tác như:
- ORDER BY
- MERGE JOIN
- STREAM AGGREGATE
- WINDOW FUNCTIONS (hàm cửa sổ như ROW_NUMBER(), RANK(), v.v.)
Cách hoạt động của Sort:
- SQL Server nhận dữ liệu từ một operator khác (ví dụ: Table Scan, Index Seek).
- Sau đó, nó sắp xếp dữ liệu theo thứ tự được yêu cầu (tăng dần hoặc giảm dần).
- Dữ liệu đã sắp xếp sẽ được chuyển tiếp cho các operator tiếp theo cần dữ liệu có thứ tự.
Ví dụ:

SELECT * FROM Products ORDER BY Price DESC;
Trong execution plan, bạn sẽ thấy một Sort operator để sắp xếp dữ liệu theo Price DESC.

Stream Aggregate

Trong SQL Server, Stream Aggregate là một operator trong execution plan dùng để thực hiện các phép tổng hợp dữ liệu (aggregation) như:
- SUM()
- COUNT()
- AVG()
- MIN()
- MAX()
- GROUP BY
Cách hoạt động của Stream Aggregate:
- Stream Aggregate yêu cầu dữ liệu đầu vào phải được sắp xếp (sorted) theo các cột dùng để nhóm (GROUP BY).
- Nó duyệt tuần tự qua dữ liệu đã sắp xếp và tính toán kết quả tổng hợp khi gặp nhóm mới.
Ví dụ:

SELECT CustomerID, COUNT(*)
FROM Orders
GROUP BY CustomerID;
Nếu dữ liệu đã được sắp xếp theo CustomerID (ví dụ nhờ một index), SQL Server có thể dùng Stream Aggregate để tính COUNT(*) cho từng nhóm.

Như vậy qua bài viết này Stanford đã giúp các bạn học sql tìm hiểu về các toán tử hay gặp trên Execution Plan trong SQL Server. Bạn có thể thực hành theo các ví dụ và hướng dẫn trong từng mục để hiểu rõ hơn nhé.

Bên cạnh đó nếu bạn đang muốn được đào tạo bài bản từ cơ bản đến nâng cao có thể tham gia ngay khóa học sql cùng chuyên gia giàu kinh nghiệm Stanford tại đây: http://bit.ly/2SLPYFF và nhận ưu đãi hấp dẫn của Stanford trong thời gian này. Bạn có thể gọi theo hotline: 0963 723 236 - 0866 586 366 để được gọi lại tư vấn trực tiếp nhé.

=============================
☎ STANFORD – ĐÀO TẠO VÀ PHÁT TRIỂN CÔNG NGHỆ
Hotline: 0963 723 236 - 0866 586 366
Website: https://stanford.com.vn
Facebook: http://bit.ly/2FN0TYb
Youtube: http://bit.ly/2TkKT7I

Tags: tìm hiểu execution plan, tìm hiểu operators trong execution plan