你带酒来,我有故事

sqlserver 索引查找与索引扫描

:: 代码生涯 二十画生 1036℃ 0评论

一、 以下情况下会导致索引查找变成索引扫描

(1) 隐式转换

sqlserver 索引查找与索引扫描

这里oc_code为char(9)类型,且建了【非聚集索引】,转换为【varchar】(【char】) 时,进行的是【索引查找】,但转换为【int】类型时,走的是【索引扫描】
并不是所有隐匿转换都会导致索引查找变成索引扫描
Implicit Conversions that cause Index Scans这篇博客介绍哪些数据类型之间隐匿转换会导致【索引扫描】。
sqlserver 索引查找与索引扫描
sqlserver 索引查找与索引扫描
查看我的数据库的排序规则为:Chinese_PRC_CI_AS
sqlserver 索引查找与索引扫描
满足的是图2的规则,
sqlserver 索引查找与索引扫描
这里ID为int类型,且建了【聚集索引】,转换为【nvarchar】 时,进行的是【索引查找】,但转换为【datatime】类型时,走的是【索引扫描】

下面是在数据库从执行计划中搜索隐式转换的SQL语句,可以在项目上线sql调优用

(2)非SARG谓词会导致执行计划从索引查找变为索引扫描
SARG(Searchable Arguments)又叫查询参数, 它的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值的范围内的匹配或者两个以上条件的AND连接。不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>;、!<;、!>;NOT EXISTS、NOT IN、NOT LIKE等,另外还有像在谓词使用函数、谓词进行运算等。
  • 索引字段使用函数会导致索引扫描
  • 索引字段进行运算会导致索引扫描
  • like模糊查询会导致索引扫描, Like语句是否属于SARG取决于所使用的通配符的类型, LIKE ‘Condition%’ 就属于SARG,走的是索引查找;LIKE  ’%Condition‘ 就属于非SARG谓词操作,走的是索引扫描
  • SQL查询返回数据页(Pages)达到了临界点(Tipping Point)会导致索引扫描(Index Scan)或表扫描(Table Scan)
  • 谓词不是联合索引的第一列会导致索引扫描(Index Scan)

更多这方面知识请访问这篇博客

二、强制执行计划走索引

数据表OrgCompanyContact:有ID字段(主键、自增ID、聚集索引)、oc_code(非聚集索引)、其他字段
数据量在2000多万行左右
数据库版本:Microsoft SQL Server 2014

sqlserver 索引查找与索引扫描

运行效果

走聚集键查找的是毫秒级别

sqlserver 索引查找与索引扫描

走聚集索引扫描用了10秒多
sqlserver 索引查找与索引扫描

转载请注明:二十画生 » sqlserver 索引查找与索引扫描

喜欢 (6)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址