2011-03-16 32 views
29

gooddoesn't matterbad包括主覆盖索引中的主键?好的/无关/包含主键的覆盖索引?

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_herecolumn_to_index_here列,然后将加入primary_key_columnother_column_here的其他表格。

+0

你的聚集索引是什么? –

回答

36

如果你正在聚类你的PK,那么并不重要。 SQL Server将忽略它,因为所有非聚簇索引都包含该行的聚簇索引键作为其定义的一部分。

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

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

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

+1

+1仅用于添加。由于OP的NCI并非唯一,因此它也将被添加到NCI的关键字中,而不仅仅被视为“包含”列。如果'NCI'被声明为唯一的,它就会出现在叶子页面中。 –

+0

@马丁 - 谢谢,我不知道。我认为它只是在叶级别作为该行的查找值。 – JNK

+2

供参考的链接http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx –

-3

只有在你真的需要它来“覆盖”查询时才包含它,否则你只是在浪费空间。覆盖索引的全部要点是您不必在基表上查找书签,因此在这方面没有用于主键。

2

反正因为PK会在指数 反正。

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