2017-09-12 100 views
1

假設我有一個名爲'demo'的表,其中包含4列; 'a','b','c'和'd'。 'demo'表中的primary keyclustered index按該順序包含列'a'和'b'。瞭解如何在非聚集索引中包含主鍵列

從查詢中引用表「演示」的「實際執行計劃」提出,新non-uniquenon-clustered index所需的列「b」和應該include列「A」。

如果我創建一個在列「B」,我需要include列「a」或將它已經成爲non-clustered index的一部分,因爲它是在primary keynon-uniquenon-clustered index

如果主鍵列'a'已經是非聚集索引的一部分,列'a'存儲爲include列還是非聚簇鍵的一部分?

+4

該列將被包含 - 不是因爲它位於主鍵中,而是因爲它在聚簇索引鍵中。支持主鍵約束的索引恰好也是您的案例中的聚集索引。 (當然,這是最常見的情況,但值得一提。)其餘部分請參見[這裏](https://dba.stackexchange.com/questions/57465/necessary-to-include-clustered-index -columns功能於非聚集的索引)。 –

回答

1

從查詢中引用表「演示」的「實際執行計劃」已經 建議,新的非唯一非 列'b'需要聚簇索引,並且應包含列'a'。

...

如果主鍵列「a」爲已非聚集索引的一部分, 是列「A」存儲爲包括柱或者是它的 非聚集鍵的一部分?

在你的情況列a將在非聚集索引各階層聚集索引鍵的部分中提出。建議給你的索引是non-unique,所以它需要uniquefier,聚簇索引鍵將用於此目的。

如果所提供的指數爲獨特,列a將被存儲在這個指數作爲行定位,在聚集表的情況下,聚集索引鍵的一部分的葉級。

a將不會被存儲兩次,如果您明確將其包含在索引的included column中,那麼我建議您將其包含在內。當某一天有人決定將聚簇錶轉換爲堆時(通過刪除聚簇索引),它將會產生變化。在這種情況下,如果您未在非聚集索引中明確包含第a列,則它將丟失,並且不再包含在非聚集索引中

0

試試這個並觀察執行計劃。你可以看到DB只使用INDEX。所以,據我所知,你不應該在你的索引中包含列A(正如你所說的,Clust。索引鍵已經包含在內)。

CREATE TABLE DEMO (COLA VARCHAR(10) NOT NULL, COLB VARCHAR(10) NOT NULL, COLC VARCHAR(10), COLD VARCHAR(10)); 

ALTER TABLE DEMO ADD CONSTRAINT DEMO_PK PRIMARY KEY (COLA, COLB); 

CREATE INDEX DEMO_IX1 ON DEMO (COLB); 



INSERT INTO DEMO VALUES ('A','B','C','D'); 
INSERT INTO DEMO VALUES ('A1','B1','C1','D1'); 
INSERT INTO DEMO VALUES ('A2','B2','C2','D2'); 

SELECT COLA,COLB FROM DEMO WHERE COLB='B1' 
0

非聚簇索引自動包含聚簇索引鍵。 在documentation你可以得到很多這方面的信息,尤其是這部分正好說明這一點:

非聚集索引架構

非聚集索引的葉層是由索引頁的 代替的數據頁面。非聚簇索引行中的行定位符是 或者是指向行的指針,或者是行的聚簇索引鍵。

如果你的表是一個堆,則行定位器將直接指向包含鍵值,但如果你的表是不是堆(這是情況下,數據行,因爲你已經有一個聚集鍵在該表上),那麼行定位符指向聚簇索引鍵。

請看clustered and nonclustered indexes described以及。

此線程討論相同的:Necessary to include clustered index columns in non-clustered indexes?

0

包括非聚集索引列a是無用的,因爲它是聚簇索引鍵的一部分。因此,它是非聚集索引葉頁中數據的一部分。具有這樣

SELECT a FROM tab WHERE b = <value> 

查詢則a值將是在非聚集索引葉數據的自然部分。

+1

由於(b)上的NCI不是唯一的,因此a將成爲索引中的關鍵列,所以不僅存在於葉頁上。請參閱http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx –

0

PK字段始終是索引鍵的一部分,而不是包含列的一部分。

我在這裏想的或許是想在B列尋找;那只有在列B是索引中的第一個鍵時才能做到。如果你先定義一個列B的索引,然後是A列,那麼它可以做到這一點。看起來,只要兩個鍵都在索引中,它就會很快樂,因爲你有一個複合PK,儘管它們現在可能順序錯誤(先是A,然後是B),從而阻止了尋找。

在PK場參考其自動顯示在指標:https://www.brentozar.com/archive/2013/07/how-to-find-secret-columns-in-nonclustered-indexes/

+1

「PK字段始終是索引關鍵字的一部分,而不是包含的列「不完全相當」,「聚集索引」列存儲爲非唯一NCI的關鍵列,並且包含唯一NCI的列「。請參閱http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx –

相關問題