我有一个带有两个外键列(CategoryId int, ProductId int)
的简单映射表。主键适用于两列。
虽然每个产品 可以拥有多个类别,但是拥有更多产品并不常见 另一方面,类别通常有10k +产品。
主键中列的顺序如何影响性能?
该表的常见用法是基于类别的产品:
SELECT ProductId FROM [table] WHERE CategoryId = @catid
我知道如果这是一个非聚集索引,我希望CategoryId
首先从上面的查询中获得最佳性能。群集索引也是如此吗?
答案 0 :(得分:3)
是的,聚集索引也是如此。聚类确定行的物理顺序。按顺序排列表有助于大多数表的I / O,因为行和页可以通过快速顺序I / O而不是随机访问来读取。
在这种情况下,如果您还需要获取单个产品的类别,则可以在(CategoryId,ProductId)上定义聚簇索引,在(ProductId,CategoryId)上定义非聚集索引。请注意两个索引如何具有相同的键。如果映射表只有2列,则两个索引上的索引页将具有完全相同的数据 - 只是以不同的顺序排序。非聚集索引应该在这里表现得非常好,因为SQL Server不需要进行书签查找来获取行中的其他数据。