SQL索引查找与索引扫描

本文导读:虽然都是通过索引取到相应数据,但是两者在过程上还是有区别的,索引扫描与表扫描差不多,都是把索引从开始扫描到结束,而索引查找就不一样了,会根据你查询的字符,定位到索引的局部位置,然后再开始查找,不用把整个索引全部扫描一遍,在效率上比索引扫描快很多。

一、索引扫描

与表扫描类似,都是把索引从开始扫描到结束。

 

二、索引查找

会根据你查询的字符,定位到索引的局部位置,然后再开始查找,不用把整个索引全部扫描一遍,在效率上比索引扫描快很多。

 

三、索引扫描与索引查找实例

 

1、表结构


create table person 
(id int, last_name varchar(30), first_name varchar(30))

create unique clustered index person_id 
on person (id)
create index person_name 
on person (last_name, first_name)

2、select id from person where last_name = 'Doe' and first_name = 'John'

查询分析:

 |--Index Seek(OBJECT:([person].[person_name]), SEEK:([person].[last_name]='Doe' AND [person].[first_name]='John'))

图形查询计划:

 

3、select id from person where last_name > 'Doe' and first_name = 'John'

查询分析:

|--Index Seek(OBJECT:([person].[person_name]), SEEK:([person].[last_name] > 'Doe'),  WHERE:([person].[first_name]='John'))

图形查询计划:

 

4、select id from person where last_name like '%oe' and first_name = 'John'

查询分析:

|--Index Scan(OBJECT:([person].[person_name]),  WHERE:([person].[first_name]='John' AND [person].[last_name] like '%oe'))

图形查询计划:

 

三、SQL Server 中什么情况极易会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)

 

1、隐式转换极易会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan)

可以通过两种方式避免SQL做隐式转换:

(1)、确保比较的两者具有相同的数据类型。

(2)、使用强制转换(explicit conversion)方式。

 

2、非SARG谓词极易会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan)

SARG(Searchable Arguments)又叫查询参数

 不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>;、!<;、!>;NOT EXISTS、NOT IN、NOT LIKE等,另外还有像在谓词使用函数、谓词进行运算等。

 

3、SQL查询返回数据页(Pages)达到了临界点(Tipping Point)极易会导致索引扫描(Index Scan)或表扫描(Table Scan)

 

4、统计信息缺失或不正确极易会导致索引扫描(Index Scan)

 

5、谓词不是联合索引的第一列极易会导致索引扫描(Index Scan)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值