2012-09-27 46 views
1

我正在创建一个用于数据处理的查找表。结构相当简单。正常的SQL Server索引是否包含主键值?

第一个字段将是主键和聚集索引。将会有第二个字段将跟踪项目类型。

我们希望在第二个字段的索引,因为一些(但不是所有的查询)将在该字段上搜索。这些查询还需要提取主键的值。

我希望利用非聚集索引的查询不必去表并获取主键值。

所以我的问题是做普通的SQL Server索引有他们的主键值,或者他们只是有一个指向聚集索引的指针(为我的目的,我只是假设主键和聚集索引是共同扩展的)?如果它只包含一个指向磁盘的指针而不是主键值,那么我正考虑使第一列(主键)成为基于第二列的正常索引的包含列。

+0

我不希望在索引中没有定义的字段出现在它,它是否群集/主键或其它方式。如果您希望非聚集索引覆盖主键列,请明确添加它。 – Oded

+0

不是*主键值* - 而是**集群键**。现在,默认情况下,主键*是集群键 - 但不一定是这样。 –

+0

谢谢你们。为了这个问题的目的,它们是一样的。看起来答案是肯定的,它的值在常规的非聚集索引上,所以我不需要包含列。 – geoffrobinson

回答

3

他们不一定有他们的PK列,但聚集索引的关键列。它们确实用作指向CI行的指针,但也可用于其他类型的查询。

例如,列A上的索引(而不是显式地在ID上)可以满足查询select A, ID from T

6

引述文档为CREATE INDEX

非聚集索引始终包含如果一个聚集索引表上定义聚集索引列。

1

索引的关键值确定了数据的顺序。数据与索引一起存储,以便数据本身是有序的。使用聚簇索引时,非聚簇索引上的指针由定义聚簇索引的值组成。否则,如果表(堆)中没有索引,则使用扫描,其中使用行标识符作为指针来搜索数据。

来源:SQL Server 2008中的查询性能优化蒸馏