簡體   English   中英

SQL Server如何在復合非聚集索引中查找?

[英]How does sql server look up in composite non-clustered index?

例如,如果我具有以下復合非聚集索引:

CREATE NONCLUSTERED INDEX idx_Test ON dbo.Persons(IsActive, UserName)

根據此答案,索引中列的順序有多重要?

如果我運行此查詢:

Select * From Persons Where UserName='Smith'

在IsActive上面的查詢中,其非聚集索引中的order = 1不存在。 這是否意味着由於IsActive不存在或其他原因,Sql Server查詢優化器將忽略在索引中查找?

當然,我可以測試它並檢查執行計划,我會這樣做,但是我也對它背后的理論感到好奇。 基數什么時候重要,什么時候不重要?

SQLServer將掃描總索引,在這種情況下,它可能是最窄的索引。

下面是我的訂單表上的一個小例子

在此處輸入圖片說明

查詢謂詞( shipperid='G' )滿足199748行,但是sql server必須讀取總行(998123)才能獲取數據。這從讀取的行數到實際的行數可見。

我從Craig freedman那里發現這非常有用。.假設您在(a,b)上具有索引..SQLServer可以在下面有效地執行此操作

  • a = somevalue和b = somevalue
  • a =一定並且b> 0
  • a =一定並且b> = 0

對於以下操作,sql server將選擇通過第一個謂詞過濾掉盡可能多的行(這也是您可能聽說過首先保留具有更多唯一值的列的原因),並將第二個謂詞用作殘差
-a> = somevalue和b = someval

對於以下情況,sql server必須掃描整個索引。

  • b =一定

進一步閱讀:
Craig Freedman的SQL Server博客:Seek謂詞
進行哈希匹配時探查殘差–執行計划中的隱性成本:Rob Farley
引爆點查詢答案:Kimberly L. Tripp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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