Sql server 外键与主键上的聚集索引

Sql server 外键与主键上的聚集索引,sql-server,performance,indexing,clustered-index,non-clustered-index,Sql Server,Performance,Indexing,Clustered Index,Non Clustered Index,表结构(SalesPersonProduct) 场景:SalesorSonid是非唯一的,事实上,此列中可能有70-80个重复项。但是,这是用于读取和联接的唯一列,当前没有索引 SalesPersonProductId只是用作PK参考,对这些表的更新是通过PK处理的,但很少。将行添加到表中后,PK或SalesorSonid都不会更新 问题: 假设我不能对表结构或相关表进行任何更改。将现有PK更改为非聚集索引,并将SalesorSonid添加为聚集索引,会更好吗?或者只是将salersonid添加

表结构(SalesPersonProduct)

场景:SalesorSonid是非唯一的,事实上,此列中可能有70-80个重复项。但是,这是用于读取和联接的唯一列,当前没有索引

SalesPersonProductId只是用作PK参考,对这些表的更新是通过PK处理的,但很少。将行添加到表中后,PK或SalesorSonid都不会更新

问题:
假设我不能对表结构或相关表进行任何更改。将现有PK更改为非聚集索引,并将SalesorSonid添加为聚集索引,会更好吗?或者只是将salersonid添加为标准的非聚集索引


我知道在幕后,许多非唯一的值将获得唯一的标识符-然而,此列几乎用于所有读取,我希望这将提供最佳性能增益,尽管代价是现在用于保留“唯一性”的额外字节在这个新的聚集索引上。

您缺少一件事

i) 以下哪一列将最常用于搜索,即在where子句中使用最多。如果salersonid,则将其设置为CI,或者您可以将salersonid和productid都设置为CI

ii)如果您可以更进一步,则还可以计算索引的选择性


成本不是额外的字节数,而是由于没有为集群键添加每一个递增模式而导致的写入操作所导致的页面拆分。如果有很多写操作,您可能会发现非聚集索引(可能包含最常见的列作为非键列)更好。如果您大部分时间都在阅读,并且阅读的数据量足够大,以至于
salersonid
上的非聚集索引实际上会导致您出现问题,那么您可能会发现将
salersonid
作为聚类键会带来净收益。长话短说,视情况而定。做一些测试。除了
salersonproductid
之外,是否有任何东西使您的行唯一?是否(salersonid,ProductId)唯一?@AntonínLejsek-No@SqlZim-可能(销售人员ID、产品ID、区域ID)
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)