Tìm hiểu về các toán tử sử dụng trong execution plan trên SQL Server Trong bài viết này Stanford sẽ giới thiệu một số toán tử hay gặp khi thực hiện câu lệnh truy vấn và xem Execution Plan của nó mà SQL Server đã sử dụng cho các bạn đang học SQL Server. Trong SQL Server, Index Scan là một trong những phương pháp mà SQL Engine sử dụng để truy xuất dữ liệu từ một bảng hoặc chỉ mục. Đây là một khái niệm quan trọng trong tối ưu hóa truy vấn. Index Scan là gì ? Index Scan xảy ra khi SQL Server duyệt qua toàn bộ chỉ mục (index) để tìm các hàng phù hợp với điều kiện truy vấn. Nó tương tự như việc đọc toàn bộ bảng, nhưng thông qua chỉ mục. Khi nào SQL Server dùng Index Scan? Không có chỉ mục phù hợp với điều kiện WHERE Truy vấn yêu cầu nhiều dòng (ví dụ: SELECT *) Cột được lọc không nằm trong chỉ mục Chỉ mục tồn tại nhưng không đủ chọn lọc (selectivity thấp) Ví dụ: SELECT * FROM Orders; Cách tối ưu để tránh Index Scan: Tạo chỉ mục phù hợp với điều kiện WHERE Dùng COVERING INDEX nếu truy vấn cần nhiều cột Tránh dùng hàm trên cột trong WHERE (ví dụ: WHERE YEAR(DateColumn) = 2025) Sử dụng INDEX HINT Trong SQL Server, Clustered Index Scan là một phương pháp truy xuất dữ liệu khi SQL Server quét toàn bộ clustered index (chỉ mục có phân cụm) để tìm các hàng phù hợp với điều kiện truy vấn. Clustered Index Scan là gì ? Là quá trình đọc toàn bộ dữ liệu trong bảng (vì clustered index chính là bảng). Xảy ra khi không có chỉ mục phù hợp hoặc khi truy vấn cần nhiều dòng dữ liệu. Tương đương với Table Scan nếu bảng không có chỉ mục phân cụm. Khi nào xảy ra Clustered Index Scan? - Không có chỉ mục phù hợp: Điều kiện WHERE không khớp với chỉ mục - Truy vấn trả về nhiều dòng: Ví dụ: SELECT * FROM Orders - Dùng hàm trên cột WHERE YEAR(OrderDate) = 2023 - Cột được lọc không nằm trong chỉ mục: SQL Server không thể dùng Index Seek Ví dụ: SELECT * FROM Orders WHERE YEAR(OrderDate) = 2025; Nếu OrderDate không có chỉ mục phù hợp, SQL Server sẽ thực hiện Clustered Index Scan để kiểm tra từng dòng. Cách tối ưu: Tạo chỉ mục phù hợp với điều kiện WHERE Tránh dùng hàm trên cột trong điều kiện lọc Dùng COVERING INDEX nếu truy vấn cần nhiều cột Trong SQL Server, Index Seek là một phương pháp truy xuất dữ liệu rất hiệu quả, được sử dụng khi SQL Server có thể tìm trực tiếp đến vị trí dữ liệu cần thiết trong chỉ mục, thay vì phải quét toàn bộ chỉ mục như với Index Scan. Index Seek là gì ? Index Seek xảy ra khi SQL Server sử dụng chỉ mục có chọn lọc cao để tìm kiếm nhanh các hàng phù hợp với điều kiện truy vấn. Nó giống như việc tra từ điển theo thứ tự chữ cái – bạn nhảy thẳng đến mục cần tìm thay vì đọc từ đầu đến cuối. Khi nào xảy ra Index Seek ? Có chỉ mục phù hợp với điều kiện trong WHERE, JOIN, ORDER BY,... Điều kiện lọc sử dụng toán tử so sánh như =, <, >, BETWEEN, IN Cột được lọc nằm ở đầu tiên trong chỉ mục có thứ tự Ví dụ: Giả sử bạn có bảng Customers với chỉ mục trên cột CustomerID. SELECT * FROM Customers WHERE CustomerID = 1001; Nếu CustomerID có chỉ mục, SQL Server sẽ dùng Index Seek để tìm nhanh dòng có CustomerID = 1001. Cách tối ưu: Tạo chỉ mục phù hợp với cột trong điều kiện WHERE Tránh dùng hàm trên cột (ví dụ: WHERE YEAR(Date) = 2025 sẽ không dùng được Index Seek) Sử dụng Covering Index nếu truy vấn cần nhiều cột Đảm bảo kiểu dữ liệu khớp giữa cột và giá trị so sánh Key Lookup Key Lookup (còn gọi là Bookmark Lookup) là một thao tác trong kế hoạch thực thi truy vấn (Execution Plan) của SQL Server, xảy ra khi: Truy vấn sử dụng chỉ mục không phân cụm (non-clustered index) để tìm các dòng dữ liệu phù hợp. Nhưng truy vấn lại cần thêm các cột không có trong chỉ mục đó. SQL Server phải truy xuất thêm dữ liệu từ bảng gốc (thường là chỉ mục phân cụm - clustered index) để lấy các cột còn thiếu. Ví dụ: Giả sử bạn có bảng: CREATE TABLE NhanVien ( MaNV INT PRIMARY KEY, HoTen NVARCHAR(100), PhongBanID INT, Luong DECIMAL(10,2) ); -- Tạo chỉ mục không phân cụm CREATE NONCLUSTERED INDEX IX_NhanVien_PhongBanID ON NhanVien(PhongBanID); Và bạn chạy truy vấn: SELECT HoTen, Luong FROM NhanVien WHERE PhongBanID = 3; SQL Server sẽ dùng IX_NhanVien_PhongBanID để tìm các dòng có PhongBanID = 3. Nhưng vì HoTen và Luong không nằm trong chỉ mục, nên SQL Server phải thực hiện Key Lookup để lấy thêm dữ liệu từ bảng gốc. Cách tối ưu: Dùng INCLUDE để thêm cột vào chỉ mục: CREATE NONCLUSTERED INDEX IX_NhanVien_PhongBanID ON NhanVien(PhongBanID) INCLUDE (HoTen, Luong); Tạo chỉ mục bao phủ (covering index): Là chỉ mục chứa tất cả các cột mà truy vấn cần. Cân nhắc hiệu quả: Không nên thêm quá nhiều cột vào chỉ mục vì sẽ làm tăng kích thước và chi phí cập nhật chỉ mục. Table Scan là gì ? Table Scan xảy ra khi SQL Server đọc toàn bộ bảng để tìm các dòng dữ liệu phù hợp với điều kiện truy vấn. Điều này thường xảy ra khi: Không có chỉ mục phù hợp để hỗ trợ truy vấn. Hoặc truy vấn cần đọc toàn bộ dữ liệu (ví dụ: SELECT * FROM TenBang không có điều kiện WHERE). Hoặc điều kiện lọc không thể sử dụng chỉ mục (ví dụ: sử dụng hàm trên cột trong WHERE). Ví dụ: Giả sử bạn có bảng: CREATE TABLE KhachHang ( MaKH INT PRIMARY KEY, TenKH NVARCHAR(100), DiaChi NVARCHAR(200), SoDienThoai NVARCHAR(20) ); Và bạn chạy truy vấn: SELECT * FROM KhachHang WHERE DiaChi LIKE '%Hà Nội%'; Vì điều kiện LIKE '%Hà Nội%' không thể dùng chỉ mục (nếu có), SQL Server sẽ thực hiện Table Scan — tức là đọc từng dòng trong bảng để kiểm tra điều kiện. Cách giảm tránh Table Scan: Tạo chỉ mục phù hợp với các cột được lọc trong WHERE. Tránh dùng hàm hoặc toán tử không tối ưu trong điều kiện lọc (LIKE '%abc%', ISNULL, CONVERT,...). Dùng chỉ mục bao phủ (covering index) nếu truy vấn cần nhiều cột. Kiểm tra Execution Plan để xác định có Table Scan hay không. Như vậy trong bài viết này Stanford đã cung cấp cho bạn những kiến thức quan trọng để hiểu hơn những toán tử được sử dụng trong Execution Plan trên SQL Server. Các bạn có thể thực hành viết câu lệnh truy vấn để thử theo mỗi mục trong bài viết nhé. Nếu có gì không rõ có thể liên hệ với Stanford để được giải đáp. Chúc các bạn học tập tốt ! 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: học execution plan, index scan, clustered index scan