Sql-Server
SQL Server中組合索引是如何實現的
我了解單索引列在 SQL Server 中的工作原理以及它是如何使用平衡樹實現的。YouTube上有很多關於這個主題的有趣影片。但是,如果索引基於多個列,我不明白它是如何工作的。例如:
CREATE NONCLUSTERED INDEX idxItemsCatState ON Items (Category,OfferState) INCLUDE ([Id],[Ranking])
以及它如何加快查詢速度
SELECT ID, Ranking FROM Items where Category = 1 AND OfferState < 3
它仍然是作為 B-Tree 實現的嗎?它如何評估值的組合?這種功能有什麼限制?
要將行儲存在 b-tree 中並執行查找,所需要的只是對行進行排序的順序。就像您可以排序一樣
(Category)
,您也可以對元組進行排序(Category, OfferState)
。在後一種情況下,首先對行進行排序Category
,然後通過排序打破任何關係OfferState
。結果索引將使用相同的 b-tree 結構,但 b-tree 中每個條目的值將是一個
(Category, OfferState)
元組。以及它如何加快查詢速度,例如……
對於您的查詢,SQL Server 可以通過以下方式執行查找:
- 尋找匹配的第一行
Category = 1
。這可以使用您熟悉的相同 b 樹搜尋來完成,SQL Server 只需要使用Category
每個(Category, OfferState)
元組的一部分。- 開始讀取行,並繼續直到
OfferState >= 3
找到一行這樣,SQL Server 將能夠直接查找所需行範圍的開頭,讀取這些行,並在行範圍的末尾停止。請注意,您可以通過查看查詢計劃
Seek Predicate
中運算符的屬性來了解此搜尋的工作原理。Index Seek
更一般地,跨列的多列索引
(a, b, c, d, ...)
可以支持在列的任何前導子集上查找,例如(a)
或(a, b, c)
,當您匹配相等時(使用=
)。如果您正在尋找一個範圍(例如,
b < 3
),SQL Server 將無法再尋找位於索引中後面的任何列。在這種情況下,它必須在 的每個不同值中執行單獨的查找b
,這是不受支持的(除非在更具體的情況下您可能不需要擔心:跨分區表的分區)。