天天看点

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%'

   执行计划:

SQL SERVER2005 Index Scan效率

  这里发现查询是可以用到索引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%'

 统计信息:  

表 '[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(索引查找):通过索引向前和向后搜索 :