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 次。

 

   这里看到搜索4行数据,用来4519次。看看索引信息

select  name,dpages,used from sysindexes where name like 'idx_operator'

 结果:  

name           dpages    used
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 次。

  这里可以发现:索引全部是4515页,有4行就通过RID搜索了4次数据页IO,结果是4519个IO

    IO信息: 4515+4=4519 

  这时可以看到,数据库把全部索引信息全部搜索了一遍(包括根页,中间页和叶级页)。

 

  原因:

      1,索引只能向前和向后搜索。这里使用类似'%abcd%'来查询。 优化器根据统计信息估计成本使用成本很低,就全扫描索引(包括根页,中间页和叶级页

         低效
            Index Scan(索引扫描):就全扫描索引(包括根页,中间页和叶级页):         

        高效

            Index Seek(索引查找):通过索引向前和向后搜索 :

posted @ 2008-08-04 17:27  zping  阅读(644)  评论(0编辑  收藏  举报