为什么索引搜索而不是扫描SQL Server 2005中的以下设置

Sun*_*xit 2 t-sql sql-server-2005

我创建了一张桌子

create table #temp(a int, b int, c int)
Run Code Online (Sandbox Code Playgroud)

我在这个表上有2个索引:

  1. c上的非聚集非唯一索引
  2. 聚集索引

当我尝试执行以下查询时:

select b from #temp where c = 3
Run Code Online (Sandbox Code Playgroud)

我看到系统用于索引扫描.这很好,因为非聚集索引没有b作为键值.因此它从列a进行索引扫描.

但是当我尝试执行以下查询时: -

select b from #temp where c= 3 and a = 3
Run Code Online (Sandbox Code Playgroud)

我看到执行计划只有索引搜索.没有扫描.这是为什么?

聚集索引和非聚簇索引都不是b作为列之一?

我希望索引扫描.

请澄清

mar*_*c_s 5

如果您具有a集群密钥,则该列将包含在该表的所有非集群索引中.

所以你的索引c也包括a,所以条件

where c= 3 and a = 3
Run Code Online (Sandbox Code Playgroud)

可以使用索引查找在该索引中找到.最有可能的,查询优化器决定做一个索引查找找到ac和一键查找来获得数据的其余部分是更快/更有效的在这里比使用索引扫描.

顺便说一句:你为​​什么期望/更喜欢索引扫描而不是索引搜索?索引搜索通常更快并且使用更少的资源 - 我总是努力获得索引搜索扫描.