Giả sử bạn có một bảng nhân viên như vậy:
CREATE TABLE Employee(EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(50),
FirstName VARCHAR(50),
HireDate DATETIME,
Salary DECIMAL)
Bạn sẽ có chìa khóa nhóm chính trên EmployeeID, và có thể một khóa không được nhóm trên (LastName, FirstName) để có thể tìm nhân viên theo tên.
CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC)
Bây giờ nếu bạn cần phải tìm "Joe Murphy" và lấy ngày thuê của mình và tiền lương, những gì xảy ra là một chỉ mục tìm kiếm tên của bạn dựa trên non-clustered chính (đó là tốt), nhưng sau đó theo thứ tự để tìm nạp ngày và tiền lương cho thuê, SQL Server cần thực hiện tra cứu đánh dấu trang được gọi là dữ liệu bảng thực tế để có được bản ghi cho Joe Murphy. Điều này rất có thể sẽ xảy ra một hoặc một số truy cập đĩa vật lý (điều này có hại về hiệu suất).
TUY NHIÊN: nếu chỉ số không clustered tên dựa trên của bạn cũng quy định cụ thể "BAO GỒM NHỮNG SỰ (HireDate, Lương)":
CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC)
INCLUDE (HireDate, Salary)
sau đó SQL Server được thực hiện khi nó đã nhìn lên Joe Murphy trong tên non-clustered index -> tất cả các trường để đáp ứng truy vấn của bạn nằm trong chỉ mục không được nhóm, vì vậy không cần phải tìm kiếm dấu trang nhiều đĩa và các truy vấn của bạn sẽ có khả năng nhanh hơn nhiều.
Nhược điểm của cột INCLUDE là tăng nhu cầu không gian đĩa bởi các chỉ mục không được nhóm, vì chúng sẽ có các cột được bao gồm trong các nút cấp lá của chúng. Đó là một sự cân bằng giữa tốc độ và kích thước (như thường lệ).
Marc
Nguồn
2009-05-04 05:13:39
đẹp giải thích về lý do tại sao nó không áp dụng cho các nhóm chỉ số – Andomar