SQL SERVER2005 Index Scan效率
以前在SQL SERVER 2000中,包括网上都说查询时“abc%”能使用到索引,“%abc%”不能使用到索引,一次做培训的时候,给大家介绍“%abc%”不能使用索引的例子发现,在SQL SERVER 2005中是可能用到索引。在SQL SERVER 2005中查询优化器的确做了很大提高,以下是例子:
表[[zping.com]]]中operator建立索引idx_operator:执行一下语句
select * from dbo.[[zping.com]]] where operator like '%882ed0e644a73010e6475b8c308a4%'
执行计划:
这里发现查询是可以用到索引Index Scan(索引扫描)的。但效率很低:
看看统计信息:
(4 行受影响)
表 '[zping.com]'。扫描计数 1,逻辑读取 4519 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '[zping.com]'。扫描计数 1,逻辑读取 4519 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
这里看到搜索4行数据,用来4519次。看看索引信息
select name,dpages,used from sysindexes where name like 'idx_operator'
结果:
name dpages used
idx_operator 4481 4519
idx_operator 4481 4519
看看索引覆盖读取的IO数:
select operator from dbo.[[zping.com]]] where operator like '%882ed0e644a73010e6475b8c308a4%'
统计信息:
(4 行受影响)
表 '[zping.com]'。扫描计数 1,逻辑读取 4515 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '[zping.com]'。扫描计数 1,逻辑读取 4515 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
这里可以发现:索引全部是4515页,有4行就通过RID搜索了4次数据页IO,结果是4519个IO
IO信息: 4515+4=4519
这时可以看到,数据库把全部索引信息全部搜索了一遍(包括根页,中间页和叶级页)。
原因:
1,索引只能向前和向后搜索。这里使用类似'%abcd%'来查询。 优化器根据统计信息估计成本使用成本很低,就全扫描索引(包括根页,中间页和叶级页)
低效
Index Scan(索引扫描):就全扫描索引(包括根页,中间页和叶级页):
高效
Index Seek(索引查找):通过索引向前和向后搜索 :