聚集索引的外键VS主键
问题描述:
表结构(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添加为标准的非聚集索引?
我知道幕后很多非唯一值将获得唯一标识符 - 但是这个列几乎用于所有读取,我期望这将提供最佳的性能增益,尽管以现在用于在这个新的聚集索引上保留“唯一性”的附加字节。
答
你错过了一件事。 i)该列中哪些列最常用于搜索,即在where子句中使用最多。如果SalesPersonId然后使其成为CI,或者可以将SalesPersonId和productid都设置为CI。
二)如果你可以走一步,然后计算指数的Seletivity也
的费用不包括在额外的字节,它是网页分割,你会从造成不写入得到每个增加的聚类密钥模式。如果有很多写操作,则可能会发现非聚集索引(可能包含最常用的列作为非关键列)会更好。如果你主要阅读并阅读足够大量的数据,以致'SalesPersonID'上的非聚集索引实际上会引起你的问题,那么你可能会发现将'SalesPersonId'作为你的聚类密钥存在净收益。长话短说,这取决于。做一些测试。 – GarethD
有没有什么能让你的行独一无二,除了'SalesPersonProductId'? – SqlZim
Is(SalesPersonId,ProductId)是唯一的吗? –