2

我创建了一个表

create table #temp(a int, b int, c int)

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

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

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

select b from #temp where c = 3

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

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

select b from #temp where c= 3 and a = 3

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

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

我希望进行索引扫描。

请澄清

4

2 回答 2

5

如果您有a作为集群键,那么该列将包含在该表的所有非集群索引中。

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

where c= 3 and a = 3

可以使用索引查找在该索引中找到。最有可能的是,查询优化器决定执行索引查找ac键查找以获取其余数据比使用索引扫描更快/更有效。

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

于 2012-04-08T07:25:00.710 回答
0

这很好,因为非聚集索引没有 b 作为键值。因此,它从列 a 进行索引扫描。

这个假设是不对的。索引查找和扫描必须处理 WHERE 子句而不是 select 子句。

现在你的问题 -

where子句通过sql优化器优化,因为有a=3的条件,可以应用聚集索引。

于 2012-04-08T09:12:52.790 回答