• SQL Server 2005 扫描计数产生原因分析(1)


          在上次做分页分析是分析时,执行下面语句:

    SELECT TOP 19  *
    FROM
     
    [dbo].[[[zping.com]]]]]
    WHERE
     (ID 
    NOT IN (SELECT TOP (10*(10000-1)) ID FROM  [dbo].[[[zping.com]]]]] ORDER BY ID DESC))
    ORDER BY
     ID 
    DESC

       显示结果为:  

    表 '[[zping.com]]'。扫描计数 2,逻辑读取 101729 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

      这里有一点我有点疑惑:扫描计数 2

     

       不光这里有 “扫描计数 2”,有时发现有其他sql语句时,就会对一个表扫描多次的统计信息

         为何要扫描多次,什么情况下有多次扫描!

       执行一下下面的语句:

    SELECT  * FROM  [dbo].[[[zping.com]]]]]
    where id='402882ed0ea1c940010ea23329920093'
    or id='402882ed0ea1c940010ea24ed9c400e8'
    or id='402882ed0ea1c940010ea24edace00fc'

      统计信息:

    (3 行受影响)
    表 
    '[[zping.com]]'。扫描计数 3,逻辑读取 12 次,物理读取 3 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

     

      这时我们发现是 “扫描计数 3”

      执行计划如图:

        

      这里执行计划很简单:

           先通过索引查找,找到索引的叶级数据索引健值,同时也找到中对应行的RID指针,通过嵌套循环找到对应行的全部数据。

           注意:sql server会把对应行的RID和索引健值保存在索引叶级数据页(堆表)。

                   sql server会把表聚集索引(非唯一系统会加上一个4字节的唯一数据保证其唯一)和索引健值保存在一起索引叶级数据页中(聚集表)。

        执行计划里就是一个从索引取取数据的描述。

        我们再来看看下面语句:    

    SELECT   * FROM  [dbo].[[[zping.com]]]]] a
    inner join (select '402882ed0ea1c940010ea23329920093' id
    union
    select '402882ed0ea1c940010ea24ed9c400e8' id
    union
    select '402882ed0ea1c940010ea24edace00fc' id
    ) b 
    on a.id=b.id 

       执行统计信息:    

    (3 行受影响)
    表 
    '[[zping.com]]'。扫描计数 0,逻辑读取 12 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

       这里的“扫描计数 0”

       为何为”0“啊,结果都一样,就是实现方法不一样,“扫描计数 ”怎么有这样的差别。 

  • 相关阅读:
    PHP四种界定符
    设计模式 单例模式与工厂模式
    PHP include与require的区别
    面向对象 static abstract interface 等知识点
    gogland golang 颜色&字体 colors&font 配置文件
    什么是游戏中的帧同步
    kcp协议详解
    kcp流模式与消息模式对比
    kcp源码走读
    kcp结构体字段含义
  • 原文地址:https://www.cnblogs.com/zping/p/1248996.html
Copyright © 2020-2023  润新知