[英]Index with Include in SQL Server
有什么區別
CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A) INCLUDE (B,C)
和
CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A,B,C)
什么SELECT
查詢會告訴我這種差異?
請注意我的索引中列的順序,與您的略有不同!
TLDR; - 如果您沒有足夠的耐心閱讀答案,請滾動到答案末尾的經驗法則。
場景#1:
CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A,B,C)
這里 3 列中的所有值,A、B 和 C 將成為搜索鍵的一部分。 因此,如果您的查詢寫成這樣:
SELECT A, B, C
FROM TABLE
WHERE A = 1
AND B = 0
AND C = 3;
或類似的,那么它將使用索引,因為您過濾的所有列都是索引KEY的一部分(A、B、C 列)。
但是,在第二種情況下(請注意 B 列在第一個括號中,即標識索引 KEY的那個):
CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (B) INCLUDE (A,C)
使用稍微不同的查詢,我們不按索引鍵過濾,在本例中為“B”列:
SELECT A, B, C
FROM TABLE
WHERE A = 1
AND C = 0;
我們的查詢將不使用索引,並會導致全表掃描。
這里的重點是,如果您總是編寫一個查詢,在其中按 INDEX KEY 中的列進行過濾,那么您的索引將被使用,您的查詢將運行得更快!
在CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (B) INCLUDE (A,C)
場景中,需要了解以下區別:
- B - index KEY (only the values in the B column are used to build the structure of the search tree)
- A, C - values included along with the index KEY (they are not used in deciding the structure of the search tree, they are attached/included at each leaf level, along with the index KEY so that you do not have to do a lookup for these column values)
如果我們有下表的數據,如果我們從第二個場景創建索引,如下所示:
然后在幕后創建的搜索樹結構將支持您的過濾器(WHERE)查詢,如下所示:
根據經驗:
如果您必須編寫如下查詢:
SELECT A, B, C
FROM table
WHERE B = 0;
最好創建一個索引,如: CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (B) INCLUDE (A,C)
但是,如果您必須編寫如下查詢:
SELECT A, B, C
FROM table
WHERE A = 0
AND B = 1
AND C = 3;
然后最好在CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A,B,C)
這樣的索引
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.