Sun*_*xit 2 t-sql sql-server-2005
我创建了一张桌子
create table #temp(a int, b int, c int)
Run Code Online (Sandbox Code Playgroud)
我在这个表上有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作为列之一?
我希望索引扫描.
请澄清
如果您具有a集群密钥,则该列将包含在该表的所有非集群索引中.
所以你的索引c也包括a,所以条件
where c= 3 and a = 3
Run Code Online (Sandbox Code Playgroud)
可以使用索引查找在该索引中找到.最有可能的,查询优化器决定做一个索引查找找到a并c和一键查找来获得数据的其余部分是更快/更有效的在这里比使用索引扫描.
顺便说一句:你为什么期望/更喜欢索引扫描而不是索引搜索?索引搜索通常更快并且使用更少的资源 - 我总是努力获得索引搜索扫描.