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


        

         为何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次数一定要大于等与其取出的行数。 

     

         强行制定索引在一般情况下不建议使用,只有你确切知道数据分布和数据量的情况下才可以使用。

    不然你会发现扫描索引速度会表扫描也慢不少。

     

  • 相关阅读:
    SQL CAST与CONVERT区别
    SQL存储过程相关信息查看
    SQLServer系统变量使用
    转 C#中哈希表(HashTable)的用法详解
    SQL中的全局变量和局部变量(@@/@)
    SqlServer中用SQL语句附加数据库及修改数据库逻辑文件名
    SQL Server中常用全局变量介绍
    SQL Server 用户定义表类型
    03- 手机App功能测试要点以及登录页面的测试
    1. APP移动端性能测试基础知识入门
  • 原文地址:https://www.cnblogs.com/zping/p/1250437.html
Copyright © 2020-2023  润新知