這取決於您的查詢。如果你只查詢這兩個值,例如:
SELECT StartNum, EndNum
FROM Books
WHERE (@Num >= StartNum) AND (@Num <= EndNum)
在這種情況下,SQL Server只具有通過兩個指標來尋求回報的數字。你的兩個索引包含你被編入索引的值,因爲它是一個索引。
但我敢肯定,你實際上包括查詢等欄目:
SELECT BookID, Title, IDBN, Author, StartNum, EndNum
FROM Books
WHERE (@Num >= StartNum) AND (@Num <= EndNum)
在這種情況下,SQL Server中,一旦發現ID「匹配的行第標準,必須再回去到數據庫中,找到那些行,以便它可以返回你:
除了已經擁有的值從兩個指標:
注:的上StartNum指數含蓄地包含聚集鍵的值,因爲這就是它知道哪一行對應於條目i的情況指數。
問題是,如果「書太多」,它必須在表中查找,那麼讀取整個表格可能會更快。
打個比方:你看書的索引中所有對「設計模式」的引用。
設計模式:4,89,221,442
如果只有4項,那麼你會不會介意的向後翻轉到索引中列出的頁面。這被稱爲書籤查找。
但是如果索引表示有827條引用一個短語會怎麼樣?
電腦:1,2,6,[剪斷825項] 1087及1128
那麼它可能只是更快的通過閱讀本書自己找到它們。在這種情況下,我們放棄並掃描整本書。 SQL Server調用此聚集一索引掃描,如果表中有聚簇索引,或者表掃描如果沒有聚集索引(即它是一個「堆表」)
如果你是隻需在您的查詢中提供StartNum和EndNum(假設您正在計數),那麼我相信您會看到一貫的低讀取和執行時間。但是,如果包含其他列,並且SQL Server認爲該查詢返回的行數太多(例如,超過表的5%),那麼它只會忘記索引並掃描整個表。
有一個交叉點,在SQL Server知道StartNum,並在表中EndNum值的分佈,因爲它的樣本值,並且對它們的分佈統計。如果@Num的某些值會返回幾行,並且SQL Server知道這一點,則它將執行相對較少的書籤查找。但是,如果您的數據分佈會導致更多行返回,那麼您將獲得聚簇索引掃描。
StartNum或EndNum上的索引?該計劃正在做一個尋求或尋求,然後掃描(它聽起來是這樣)。你爲什麼期望一列中的一個索引能夠滿足*兩個條件? – 2009-06-05 16:33:47
嗨Remus, 該索引位於兩列,只有索引查找。 – 2009-06-08 06:52:28