1

我有一个带有两个外键列的简单映射表 (CategoryId int, ProductId int)。主键应用于两列。

虽然每个产品可以有多个类别,但很少有超过 2 个类别。另一方面,类别通常有 10k 多个产品。

主键中列的顺序如何影响性能?

该表的常见用法是基于类别的产品:

SELECT ProductId FROM [table] WHERE CategoryId = @catid

我知道如果这是一个非聚集索引,我首先希望CategoryId从上述查询中获得最佳性能。聚集索引也是如此吗?

4

1 回答 1

3

是的,聚集索引也是如此。聚类决定了行的物理顺序。像这样按顺序排列表有助于大多数表上的 I/O,因为行和页可以通过快速顺序 I/O 而不是随机访问来读取。

在这种情况下,如果您还需要获取单个产品的类别,则可以在 (CategoryId, ProductId) 上定义聚集索引,在 (ProductId, CategoryId) 上定义非聚集索引。请注意两个索引如何具有相同的键。如果映射表只有 2 列,则两个索引上的索引页将具有完全相同的数据——只是排序不同。非聚集索引在这里应该表现得很好,因为 SQL Server 不需要进行书签查找来获取行中的其他数据。

于 2012-11-28T23:41:31.770 回答