簡體   English   中英

包含在 SQL 服務器中的索引

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM