在覆盖索引中包含主键是好还是无关紧要?

时间:2011-03-16 16:11:13

标签: sql-server tsql

gooddoesn't matter还是bad来包含覆盖索引中的主键?

CREATE NONCLUSTERED INDEX index_name_here ON dbo.table_name_here
(column_to_index_here) 
INCLUDE (primary_key_column,other_column_here)
WITH( STATISTICS_NORECOMPUTE=OFF, IGNORE_DUP_KEY=OFF, --<default junk from SSMS
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

我认为这没关系,因为PK无论如何都会在索引中。

编辑 - 澄清 我的primary_key_column已群集,但您可以解释/提供信息。

我将加入dbo.table_name_here列上的column_to_index_here,然后加入primary_key_columnother_column_here上的其他表格。

2 个答案:

答案 0 :(得分:53)

如果您正在对PK进行聚类,那么无关紧要。 SQL Server将忽略它,因为所有非聚集索引都包含该行的聚簇索引键作为其定义的一部分。

它不会在索引中使用任何额外的空格,但将它包含在定义中是多余的。

如果您的PK未包含在您的聚簇索引中,那么只有在您需要将该字段作为使用索引的同一查询的一部分进行检索时才包含它。

还要记住,当INCLUDE索引中的字段时,它不在非叶节点中,即索引未按该值排序。

答案 1 :(得分:3)

  

因为PK将在索引中   反正。

假设您的意思是PK在该语句的另一个索引中,您是否在该索引中包含主键取决于您是否要在查询中选择它。如果您要选择它,请将其包含在索引中,否则请将其保留。对于聚集在PK上的表,请参阅@JNK答案。