Sql-Server

SQL Server中組合索引是如何實現的

  • October 17, 2015

我了解單索引列在 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,這是不受支持的(除非在更具體的情況下您可能不需要擔心:跨分區表的分區)。

引用自:https://dba.stackexchange.com/questions/118331