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 @   zping  阅读(645)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示