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)是唯一的吗? –

回答