您的位置:首页 > 数据库

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

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

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

另外,首选需要澄清的是,扫描并不总是坏的,而查找并不总是好的,但是在绝大部分情况下,特别是在大表中返回少量数据时,查找会有更好的性能表现。同样,并不总是有方法在每个查询中移除扫描操作。如果查询的性能问题是因为扫描,那么移除扫描操作会更好,否则,看看是否有什么改变方式去提高性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: