SQL SERVER中索引扫描与索引查找

前提是在大表中进行少量数据的查询,因为我们绝大部分都是从一个大表中返回少量数据,所以索引必不可少。不知道大家在执行计划当中是否有发现:“索引扫描”与“索引查找”?

1、索引扫描
与表扫描类似,都是把索引从开始扫描到结束。
2、索引查找
会根据你查询的字符,定位到索引的局部位置,然后再开始查找,不用把整个索引全部扫描一遍,在效率上比索引扫描快很多

一看到“快很多”,眼睛就亮了,但是如何使得自己写的语句不会导致索引查找(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等,另外还有像在谓词使用函数、谓词进行运算等。

另外,首选需要澄清的是,扫描并不总是坏的,而查找并不总是好的,但是在绝大部分情况下,特别是在大表中返回少量数据时,查找会有更好的性能表现。同样,并不总是有方法在每个查询中移除扫描操作。如果查询的性能问题是因为扫描,那么移除扫描操作会更好,否则,看看是否有什么改变方式去提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值