sql 服务器如何在复合非聚集索引中查找?

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 在非聚集索引中不存在。这是否意味着 Sql 服务器查询优化器将忽略在索引中查找,因为 IsActive 不存在或什么?

当然我可以只测试它并检查执行计划,我会那样做,但我也很好奇它背后的理论。什么时候基数重要,什么时候不重要?

SQLServer 将扫描总索引,在这种情况下它可能是最窄的索引..

下面是订单的一个小例子table我有

查询谓词(shipperid='G')满足199748行,但sql服务器必须读取总行数(998123)才能得到data.This从读取行数到实际可见行数。

我从 Craig freedman 那里发现这个非常有用..假设你在 (a,b) 上有索引..SQLServer 可以有效地做下面的事情

  • a=somevalue 和 b=somevalue
  • a=someval 和 b>0
  • a=someval 和 b>=0

对于以下操作,sql 服务器将选择通过第一个谓词过滤掉尽可能多的行(这也是您可能听说过首先保留具有更多唯一值的列的原因)并且将使用第二个谓词作为残差
- a>=somevalue 和 b=someval

对于以下情况,sql 服务器必须扫描整个索引..

  • b=someval

进一步阅读:
Craig Freedman's SQL Server Blog :Seek Predicates
Probe Residual when you have a Hash Match – a hidden cost in execution plans:Rob Farley
The Tipping Point Query Answers:Kimberly L. Tripp