假设我们有一个表如下:
PK -- nonclustered primary key
Col1 -- unique clustered
Col2
Col3
这个指标是:
nonclustered index on (Col2, Col3)
与此索引有任何不同:
nonclustered index on (Col2, Col3) include (PK)
如果我的 PK 是集群而不是非集群怎么办?现在它是否有所作为?
编辑添加:
我想这是一种迂回的询问方式:非聚集索引的指针是否返回到基于聚集索引或主键的表?我假设使用的是聚簇索引 RID。
聚簇索引键作为行标识符包含在每个非聚簇索引中。
SQL Server 只是忽略了一个
INCLUDE
聚簇索引键。如果您的 PK 索引是,
NONCLUSTERED
那么它不会包含在所有其他 NC 索引的每一行中。您可以通过制作两个相同的索引(一个有
INCLUDE(ClusterKey)
一个没有)并比较大小来自己进行测试。它们将是相同的,即使在数亿行上也是如此。想象一下,如果每个非聚集索引都包含主键,如您所想:
根据您的表,这可能包括实现您的主键的非聚集索引。假设您正在对表执行查询,并且使用了主键索引。使用此索引后,无法找到表的剩余数据。所以这不可能是事情的运作方式。
或者另一个假设:
每个不是主键索引的非聚集索引都存储主键。如果主键索引是非聚集的,那么它包含一些神奇的其他值(例如聚集键)。但这意味着,与任何使用非聚集、非主键索引的查询相比,现在必须执行两倍的索引操作——一次是针对它自己的索引,另一次是针对主键索引。我们还需要非聚集索引的两个独立实现。
由于这些都不太合适,所以很明显为什么非聚集索引存储聚集索引键,而不是其他任何东西。
如果 PK 是聚簇 PK,则 PK 将包含在您创建的每个索引中,唯一非聚簇索引除外。如果您需要唯一非聚集索引上的 PK 列,那么您仍然需要包含该列。