4

表結構(SalesPersonProduct)聚集索引的外鍵VS主鍵

SalesPersonProductId INT (PK, Clustered) 
SalesPersonId  INT (FK - non-unique - Nullable) 
ProductId   INT (FK - non-unique - Nullable) 
AreaId    INT (Not Null) 
DistributionType  INT (Not Null) 
ItemOrder   INT (Not Null) 
ItemSize    INT (Not Null) 

場景:SalesPersonId不是唯一的,實際上有可能是70 - 在此列80重複。但是,這是用於讀取和連接的唯一列,並且當前沒有索引。

SalesPersonProductId僅作爲參考PK使用,對這些表的更新通過PK進行處理,但非常少見。一旦行被添加到表中,PK或SalesPersonId都不會更新。

問題:
假設我可以不改變表結構或相關表。將現有PK更改爲非聚集索引並將SalesPersonId添加爲聚集索引會更好嗎?或者只是將SalesPersonId添加爲標準的非聚集索引?

我知道幕後很多非唯一值將獲得唯一標識符 - 但是這個列幾乎用於所有讀取,我期望這將提供最佳的性能增益,儘管以現在用於在這個新的聚集索引上保留「唯一性」的附加字節。

+1

的費用不包括在額外的字節,它是網頁分割,你會從造成不寫入得到每個增加的聚類密鑰模式。如果有很多寫操作,則可能會發現非聚集索引(可能包含最常用的列作爲非關鍵列)會更好。如果你主要閱讀並閱讀足夠大量的數據,以致'SalesPersonID'上的非聚集索引實際上會引起你的問題,那麼你可能會發現將'SalesPersonId'作爲你的聚類密鑰存在淨收益。長話短說,這取決於。做一些測試。 – GarethD

+1

有沒有什麼能讓你的行獨一無二,除了'SalesPersonProductId'? – SqlZim

+0

Is(SalesPersonId,ProductId)是唯一的嗎? –

回答