外键VS主键的聚簇索引

时间:2017-03-27 12:15:29

标签: sql-server performance indexing clustered-index non-clustered-index

表结构(SalesPersonProduct)

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 个答案:

答案 0 :(得分:0)

你错过了一件事。

i)哪一列最常用于搜索,即在where子句中使用最多。如果SalesPersonId然后使其成为CI,或者您可以将SalesPersonId和productid作为CI。

ii)如果你可以更进一步,那么计算索引的选择性

https://www.google.co.in/webhp?sourceid=chrome-instant&rlz=1C1CHMO_enIN556IN556&ion=1&espv=2&ie=UTF-8#q=how+to+find+selectivity+of+an+index