2011-03-16 70 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答案。