2009-05-03 48 views

Trả lời

1

Điều này sẽ lưu trữ dữ liệu cho cột bằng nút chỉ mục để truy cập nhanh vào các truy vấn sử dụng chỉ mục.

Reference:

BAO GỒM NHỮNG SỰ (cột [, ... n])

Chỉ định các cột không-key là thêm vào cấp lá của chỉ số nonclustered . Chỉ số không được chỉ định có thể là duy nhất hoặc không độc đáo.

6

Khi chỉ mục được sử dụng, nó có thể dẫn đến vị trí của bản ghi hoàn chỉnh hoặc tất cả các trường bạn cần có thể được lưu trữ trong chính chỉ mục (vì vậy bạn không cần phải hoàn thành bản ghi.)

Trong trường hợp đầu tiên, bạn có hai trường hợp đọc tốt nhất, một để đọc chỉ mục và một để đọc toàn bộ bản ghi.

Trong trường hợp thứ hai, bạn có mọi thứ bạn cần từ việc đọc chỉ mục.

Bạn có thể BAO GỒM các cột bổ sung được lưu trữ cùng với chỉ mục nếu cùng với (các) trường bao gồm chỉ mục, bạn có đầy đủ các truy vấn được thỏa mãn mà không cần đọc thêm cho hàng.

Đây không phải là vấn đề đối với chỉ mục CLUSTERED vì việc đọc chỉ mục giống như đọc toàn bộ hàng.

Có một lợi thế đặc biệt lớn nếu bạn đang đọc một số phím chỉ mục trong một chuỗi (ví dụ SELECT ... FROM ... WHERE keys GIỮA n1 AND n2) vì chỉ mục đọc sẽ được lưu trữ cạnh nhau và có thể được đọc với có lẽ chỉ một hoặc hai lĩnh vực vật lý; và không cần phải tìm phần còn lại của hồ sơ cung cấp thêm đòn bẩy.

+1

đẹ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

0

Loại bỏ nhu cầu thực hiện tra cứu khóa nếu truy vấn sử dụng cột được bao gồm. Thí dụ.

select ssn, firstname from myusers where ssn='111-11-1111' 

Một chỉ số thích hợp sẽ trông như thế này

create index idx_user_ssn nonclustered on myusers(ssn) include(firstname) 
+0

Thank you very much – Anoop

29

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

+1

vĩ đại giải thích ... Cảm ơn bạn rất nhiều – Anoop

+1

Nghiêm túc hoàn hảo! –

+1

Câu trả lời rõ ràng và rõ ràng – Nicool

0

Ưu điểm của chỉ mục bao gồm để tránh giới hạn kích thước.

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode 
FROM Person.Address 
WHERE PostalCode BETWEEN N'98000' and N'99999' 

Mặc dù bạn có thể xác định tất cả các cột như cột quan trọng, kích thước then chốt sẽ là 334 bytes.Only tiêu chí chúng tôi sử dụng ở đây là mã bưu điện, Sử dụng mã bưu điện trong keycolumn và nghỉ ngơi trên cột phi chính sẽ cải thiện hiệu suất và cũng tiết kiệm kích thước.

CREATE INDEX IX_Address_PostalCode 
ON Person.Address (PostalCode) 
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); 
Các vấn đề liên quan