SQL Server 2005 强行扫描索引利和弊分析(2)

本文针对SQL Server中出现的超出预期的I/O次数进行了深入探讨。通过详细的案例分析,揭示了SQL Server读取数据页的方式及如何导致实际I/O次数高于理论值的原因。此外,文章还讨论了索引查询的I/O次数与取出行数的关系,并给出了优化建议。
    

     为何IO数这么多,按理论:最大可能IO次数=表页数+索引页数

 

     我们看看数据库里索引"idx_operator"的统计页数:

      查看sql代码:      

select   object_name (id) N ' 表名 ' ,dpages N ' 索引叶级页数 '  ,used N ' 索引全部页数 '  
from  sysindexes  where  name = ' idx_operator '

    显示结果:

表名           索引叶级页数  索引全部页数
[ zping.com ]     5549             5595

   

   注意: 索引全部页数=索引根级(1页)+索引中间级页数+索引叶级页数

 

   那么最大IO=5595+19497 =25092次 ,但和42385次也差别很大:多出这么多的IO次数是哪来的啊?

 

    晚上一直对这个不明和郁闷,为何啊。。。。。

 

   网上也没发现是什么原因,后来做了大量的测试和假设?

 

   终于找到一个合理的答案:

 

   结论是:
     SQL server在读取IO数据页次,对同一数据页读取多次。

     以前一直看SQL server的书籍中就知道:SQL server中读取的最小单位是页(8K),的确当时还没真正领会含义。  

     因为我们这里有4万多行,所有数据库每读取一行就读取一页。就会有4万多次IO

 

   扩展

    通过这个道理我们延伸一下:

      如果查询没达到索引覆盖,索引查询的IO次数一定要大于等与其取出的行数。 

 

     强行制定索引在一般情况下不建议使用,只有你确切知道数据分布和数据量的情况下才可以使用。
不然你会发现扫描索引速度会表扫描也慢不少。
 

转载于:https://www.cnblogs.com/zping/archive/2008/07/24/1250437.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值