2012-04-04 75 views
3

假設我有一個典型的客戶表;搜索字段上的TSQL索引,我應該包括Id

Id Int Identity Primary Key, 
FirstName varchar(255), 
LastName varchar(255), 
Phone VarChar(30) 

因此,主鍵在Id上創建一個聚集的唯一索引。

爲了加快搜索速度,我想添加索引到名稱字段。

我的問題是我是否應該將ID添加到這些索引或將這些索引自縛主鍵反正。

例如;

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName, Id) 

......這是過度殺傷力?

以下是或多或少有效?

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName) 

TIA

+0

你會搜索什麼?始終使用完整的名字/姓氏或單獨或...? – 2012-04-04 16:03:31

+0

這真的是一個更通用的問題。它是否提供了在表上的任何其他索引上具有主鍵字段的好處? – 2012-04-04 17:59:25

+0

一般不會,@MichaelFredrickson的答案几乎涵蓋了它。 – 2012-04-04 18:01:41

回答

2

這是沒有意義的ID添加到您的其他指數。它只會是有益的,如果你有大量具有相同firstNamelastName組合行的,你已經知道了ID ...

但如果你已經知道了ID爲您要搜索的記錄,你只能使用您的聚集索引進行搜索。

此外,每一個非聚集索引已經包含聚集索引值,以便它可以使用聚集索引已使用非聚集索引找到後查找該行。 You wouldn't have to include ID in your non-clustered index if you wanted to make it a covering index for the fields (FirstName, LastName, Id)

最後一點,如果您使用FirstNameLastName一個指數,該指數將只在用戶的搜索包括FirstName,索引的前沿應用。如果您計劃僅使用LastNameFirstName執行搜索,請創建兩個索引,每列一個索引。

+0

感謝Michael,非聚集索引指向聚簇索引回答我的問題。 如果可以,我只想稍微擴展這個問題。 如果主鍵是一個UniqueIdentifier,爲了性能的原因,我會讓它成爲非集羣。你還會推薦從後續的索引中刪除ID嗎? – 2012-04-04 18:02:19

+0

我仍然不會使索引的ID部分,如果你需要['INCLUDE'](http://msdn.microsoft.com/en-us/library/ms188783.aspx)該ID的順序爲了使索引覆蓋,那麼這可能是合理的..但我認爲這種情況可能不太可能,並且您不可能需要包含該ID。不過,我建議不要讓你的PK成爲一個唯一的標識符,因爲即使使用帶有GUID的非聚集索引,你仍然會遇到很多碎片(http://www.sqlskills.com/BLOGS/PAUL/後/集羣 - 或聚簇索引上-A-隨機GUID.aspx)。 – 2012-04-04 20:47:07

+0

謝謝Michael, 在一個項目上選擇UniqueIdentifier不在我的手中。 我至少得到了它們上的聚簇索引轉換爲非聚簇! – 2012-04-04 23:48:31