2009-05-03 125 views

回答

1

這將存儲具有索引節點的列的數據,以便快速訪問使用索引的查詢。

Reference

INCLUDE(列[,... n])的

指定是 加到 聚簇索引的葉級的非鍵列。非集羣 索引可以是唯一的或非唯一的。

6

當使用索引時,它可以導致完整記錄的位置,或者您需要的所有字段都可以存儲在索引本身中(因此您無需完成記錄。 )

在第一種情況下,您有兩個讀取最佳情況,一個讀取索引,一個讀取完整記錄。

在第二種情況下,您可以通過閱讀索引獲得所需的一切。

如果與包含索引的字段一起使用,則可以包含與索引一起存儲的額外列,從而在不需要額外讀取行的情況下滿足完整查詢。

這對於CLUSTERED索引不是問題,因爲讀取索引與讀取整行相同。

如果您正在讀取序列中的多個索引關鍵字(例如,SELECT ... FROM ... WHERE KEY BETWEEN n1和n2),因爲索引讀取可能會彼此相鄰存儲並且可能只能閱讀一個或兩個物理扇區;而不需要找到其餘的記錄提供更多的槓桿作用。

+1

爲什麼它並不適用於聚簇索引 – Andomar 2009-05-04 06:12:19

0

如果查詢使用包含的列,則不需要執行鍵查找。例。

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

一個適當的索引是這樣

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

非常感謝您 – Anoop 2009-05-05 20:03:48

29

讓我們假設你有一個僱員表所示:

CREATE TABLE Employee(EmployeeID INT IDENTITY(1,1) PRIMARY KEY, 
         LastName VARCHAR(50), 
         FirstName VARCHAR(50), 
         HireDate DATETIME, 
         Salary DECIMAL) 

你會對僱員的主要聚集鍵,並有可能(LastName,FirstName)上的非羣集密鑰,以便能夠按名稱查找員工。

CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC) 

現在,如果你需要找到「喬·墨菲」和檢索他受僱日期和工資,會發生什麼是索引您的姓名基於非聚集鍵尋求(這是好的),但後來爲了爲了獲取僱傭日期和薪水,SQL Server需要對實際的表數據進行所謂的書籤查找以獲得Joe Murphy的記錄。這很可能會導致一個或多個物理磁盤訪問(這在性能方面不好)。

但是:如果您的基於域名的非聚集索引還規定「包括:(僱傭日期,工資)」:

CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC) 
     INCLUDE (HireDate, Salary) 

那麼SQL服務器只進行一次,它擡起頭喬·墨菲在非羣集名稱index - >所有滿足查詢的字段都在非聚集索引中,因此不再需要執行磁盤密集書籤查找,並且查詢速度可能會更快。

INCLUDE列的缺點是增加了非聚簇索引所需的磁盤空間,因爲它們將在其葉級節點中包含列。這是速度和尺寸之間的平衡(如往常一樣)。

Marc

+1

很好的解釋......非常感謝你 – Anoop 2009-05-05 20:02:52

0

Include Index的優點是避免大小限制。

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

雖然你可以定義所有列作爲鍵列,密鑰大小是334個bytes.Only標準,我們這裏使用的是郵編,在keycolumn使用郵編和休息對非鍵列將提高性能和也節省了大小。

CREATE INDEX IX_Address_PostalCode 
ON Person.Address (PostalCode) 
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); 
相關問題