【问题标题】:sql statistics io scan count explanationsql statistics io scan count解释
【发布时间】:2010-10-01 10:56:02
【问题描述】:

简单的问题,但我在谷歌上没有找到很好的解释。使用 Set Statistics IO ON 时,在 management studio 的消息窗口中提供了逻辑读取和扫描计数。如果我有:

tblExample,扫描计数 5,逻辑读取 20

扫描计数意味着什么?

【问题讨论】:

标签: sql performance count statistics database-scan


【解决方案1】:

来自在线书籍

扫描次数: 执行的索引或表扫描次数。

逻辑读取: 从数据缓存中读取的页数。

物理读取: 从磁盘读取的页数。

预读: 为查询放入缓存的页数。

参见此处:http://technet.microsoft.com/en-us/library/ms184361.aspx

【讨论】:

    【解决方案2】:

    就“表扫描”的含义而言,我能找到的最好的方法是:

    扫描计数仅表示在查询期间访问表或索引的次数。它可能是完全扫描、部分扫描或简单的查找。

    换句话说,仅扫描计数本身信息不足。您需要确切地知道这些扫描是什么——因此您必须查看实际的执行计划以获取更多详细信息。归根结底,它本身并不是一个非常有用的指标!

    另外:

    http://www.eggheadcafe.com/software/aspnet/32171165/set-statistics-io-scan-count-explanation.aspx

    很遗憾,这些天的扫描计数信息量不是很大。嗯,嗯, 如果您看到像 19223 这样的数字,则该表可能已被访问 通过嵌套循环连接多次。

    曾经有一段时间,“扫描计数”仅表示“访问的时间表”, 但那是很久以前的事了,也许是在 SQL 6.5 中。你唯一能得到的时间 定义为 0 的扫描计数与 ...

    select *
    from TestA1
    where CompanyID = 1
    and CompanyID = 2
    

    ... SQL Server 可以断定查询不会返回 任何行,而不访问表。

    【讨论】:

    • 可以获得 0 的扫描计数,如果您正在查找唯一索引,则返回一行。例如SET STATISTICS IO ON; SELECT * FROM [master].[dbo].[spt_values] WHERE type='A' AND number=1 AND name='rpc' 这是记录在案的here
    【解决方案3】:

    如果继续收集msdn引用。然后是[2]中重复的[1]:

    • "逻辑读取
      该值表示处理查询所需的页面访问总数。 从数据缓存中读取每个页面,无论是否有必要将该页面从磁盘带入缓存以进行任何给定的读取。此值始终至少与 Physical Reads 的值一样大,并且通常大于此值。同一个页面可以被多次读取(例如从索引驱动查询时),因此一个表的逻辑读取计数可能大于一个表中的页面数。

    • 物理读取
      该值表示从磁盘读取的页数;它始终小于或等于 Logical Reads 的值。 Performance Monitor 显示的 Buffer Cache Hit Ratio 的值是根据 Logical Reads 和 Physical Reads 值计算得出的,如下所示:

    • 预读
      Read Ahead Reads 值表示在处理查询时使用预读机制读入高速缓存的页数。这些页面不一定由查询使用。如果最终需要页面,则计算逻辑读取但不计算物理读取。较高的值意味着 Physical Reads 的值可能较低且缓存命中率可能高于... [被 vgv8 截断]

    • 扫描计数
      Scan Count 值表示访问相应表的次数。嵌套循环连接的外部表的扫描计数为 1。对于内部表,扫描计数可能是“通过循环”访问表的次数。逻辑读取数由扫描计数乘以每次扫描访问的页数的总和确定。但是,即使对于嵌套循环连接,内表的扫描计数也可能显示为 1。SQL Server 可能会将所需的行从内表复制到缓存中的工作表中,并使用此工作表来访问实际的数据行。在计划中使用此步骤时,通常不会在 STATISTICS IO 输出中指示它。您必须使用 STATISTIC TIME 的输出以及有关使用的实际处理计划的信息来确定执行查询所涉及的实际工作。对于连接中涉及的两个表,散列连接和合并连接通常将扫描计数显示为 1,但这些类型的连接可能涉及更多的内存。您可以在执行查询时检查 sysprocesses 中的 memusage 值,但与 physical_io 值不同的是,这不是累积计数器,仅对当前运行的查询有效。一旦查询完成,就无法查看它使用了多少内存。”

    [1]
    第 4 章查询性能故障排除。监控查询性能
    Microsoft® SQL Server™ 2005 内部:查询调优和优化
    通过卡伦德莱尼


    出版商:微软出版社
    发布日期:2007 年 9 月 26 日
    打印 ISBN-10:0-7356-2196-9
    打印 ISBN-13:978-0-7356-2196-1
    页数:448

    [2]
    监控查询性能
    优化查询性能
    作者:Ron Soukup,Kalen Delaney
    Microsoft Press 出版的 Inside Microsoft SQL Server 7.0 第 14 章
    http://technet.microsoft.com/en-us/library/cc917719.aspx#ECAA

    【讨论】:

      【解决方案4】:

      【讨论】:

      【解决方案5】:

      忽略扫描计数,这并不重要。专注于如何降低逻辑读取。基于http://www.practicalsqldba.com/2013/07/sql-server-performance-tuning.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多