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

来源:互联网 发布:mac安装flash失败 编辑:程序博客网 时间:2024/06/03 21:33

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

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等,另外还有像在谓词使用函数、谓词进行运算等。

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

0 0