性能调优是DBA的重要工作之一。很多人会带着各种性能上的问题来问我们。我们需要通过SQL Server知识来处理这些问题。经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很慢。对此,我们可以笑着回答:这个存储过程运行多次后,已经累趴了,所以很慢。

存储过程或语句运行时间取决于服务器的工作量。如果在晚上,服务器负担很重的话,你的存储过程可能需要更多的时间来运行,因为它在等待CPU周期(CPU cycle)和IO完成(IO completion)。为了获得一致的响应时间,我们需要减少执行完成的资源需求,那就是所谓的性能调优。

IO和CPU是完成执行的主要资源使用对象。更少的资源使用,更稳定的性能表现。这篇文章我们来理解下性能调优中DBCC STATISTCS IO所扮演的角色。

默认情况下SET STATISTCS IO是停用的,我们可以通过下列语句在当前会话级别打开。

1 SET STATISTICS IO  ON

这个语句可以帮助我们获得在语句执行时,所发生IO数(页读/写)。我们来看一个例子的输出。

 1 USE StatisticsDB
 2 GO
 3 SELECT * INTO SalesOrderDetail FROM AdventureWorks2008R2.Sales.SalesOrderDetail
 4 GO
 5 SET STATISTICS IO ON
 6 DBCC dropcleanbuffers
 7 DBCC freeproccache
 8 GO
 9 SELECT * FROM SalesOrderDetail
10 GO
11 SELECT * FROM SalesOrderDetail 

Set Statistics IO的输出信息可以在消息TAB页里找到。同样的语句我们执行了2次,第一次是在清空缓存后执行,第2次没有。

我们来看下输出信息:

扫描计数(Scan count):

根据微软在线帮助,扫描计数是在任何方向都达到叶级别后启动的查询/扫描数,目的在于检索用于构造输出的最终数据集的所有值。

  • 如果使用的索引是主键的唯一索引或聚集索引并且您仅查找一个值,则扫描计数为 0。 例如 WHERE Primary_Key_Column = <value>。
  • 当您使用对非主键列定义的非唯一的聚集索引搜索一个值时,扫描计数为 1。 这是为了针对您正在搜索的键值检查重复值。 例如 WHERE Clustered_Index_Key_Column = <value>。

  • 当 N 为通过使用索引键定位键值后,在叶级别的左侧或右侧启动的不同查找/扫描数时,则扫描计数为 N。

这个数字告诉我们优化器所选择的计划,对这个对象的重复读取次数。很多人误以为这个是对整张表的读取次数,这是完全错误的。

我们通过一个例子来理解扫描计数。

 1 CREATE TABLE ScanCount (Id INT IDENTITY(1,1),Value CHAR(1))
 2 INSERT INTO ScanCount (Value ) VALUES ('A') ,('B'),('C'),('D'), ('E') , ('F')
 3 CREATE UNIQUE CLUSTERED INDEX ix_ScanCount ON ScanCount(Id)
 4
 5 SET STATISTICS IO ON
 6 --Unique clustered Index used to search single value
 7 SELECT * FROM ScanCount  WHERE Id =1
 8 --Unique clustered Index used to search multiple value
 9 SELECT * FROM ScanCount  WHERE Id IN(1,2,3,4,5,6)
10 --Unique clustered Index used to search multiple value
11 SELECT * FROM ScanCount  WHERE Id BETWEEN 1 AND 6

我们来看下上面3个查询语句的输出。

在第1个SELECT语句的输出里,扫描计数为0。这和MSDN里在线帮助“如果使用的索引是主键的唯一索引或聚集索引并且您仅查找一个值,则扫描计数为 0。”描述一致。因为它是唯一索引(聚集/非聚集索引),不需要在叶子层,进行进一步的向左或向右扫描,因为这里只有一个值来匹配。那也是在唯一索引上查找单一值,扫描计数为0的原因。扫描计数是1的话,会在非唯一索引(聚集或非聚集索引)上发生。

对于第2个SELECT语句,扫描计数是6.这是因为我们在找多个不同值。MSDN在线帮助对此有详细说明: “如果使用的索引是主键的唯一索引或非聚集索引,你在查找N个值,则扫描计数为N。”。

我们来看看执行计划里的SEEK谓语,将更清晰:

即使只有一个where条件,还是会分裂成多个谓语。对于每个SEEK谓语,它会生成1个扫描数。

对于最后一个SELECT语句,扫描计数为1,因为MSDN在线帮助说了: “当 N 为通过使用索引键定位键值后,在叶级别的左侧或右侧启动的不同查找/扫描数时,则扫描计数为 N。” 在叶子节点聚集索引结构用来找到1值后,叶子层的向左扫描开始,直到找到值6。我们看下执行计划里的SEEK 谓语,将更清晰:

逻辑读取(logical Read):

从数据缓存读取的页数。数字越小,性能越好。在性能调优中这个数字非常重要。因为它不会随着执行又执行而改变,除非数据或查询语句有变动。在进行性能调优时,这个可以作为性能提升的重要参考。

物理读取(physical reads):

从磁盘读取的页数。这个会随着执行又执行而改变。大多数情况下,连续第2次的执行时,它的物理读取值为0(可以参考上面连续查询的物理读取数变化)。

如果连续执行后,物理读取次数下降了,我们可以假定是服务器上内存使用配置的错误,或者服务器工作量饱和,有内存压力。你需要在服务器级别思考问题的原因。在查询调优时,这个数字不太重要,因为它一直在变,对于下降这个值,你不能对它做出太多控制。

预读 (read-ahead reads):

为进行查询而放入缓存的页数。这个值告诉我们物理页读取数,即SQL Server执行的,作为预读机制的一部分。在查询执行请求那些可能用到页之前,SQL Server把物理数据页读入缓存,用于完成接下来查询的页需要。

可以看到,物理读取是2次,预读是946次。这就是说,查询执行请求了2个页,并预读了946个页到数据缓存,SQL Server估计下次查询可能要用到这些页。和物理读取一样,这个值对在查询调优里并不重要。

lob 逻辑读取(lob logical reads):

从数据缓存读取的 text、ntext、image 或大值类型 (varchar(max)、nvarchar(max)、varbinary(max)) 页的数目。这个和逻辑读一样重要,我们要非常重视。

lob 物理读取(lob physical reads):

从磁盘读取的 text、ntext、image 或大值类型页的数目。

lob 预读(lob read-ahead reads):

为进行查询而放入缓存的 text、ntext、image 或大值类型页的数目。

总结下,逻辑读取和LOB逻辑读取是2个重要数值,在性能调优时,我们要重点围观。如果把这2个值调低,不在本文的讨论范围。通常创建合适的索引或重写查询可以帮助我们彻底降低这2个值。

参考文章:

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/07/16/sql-server-performance-tuning-understanding-dbcc-statistics-io-output/

性能调优:理解Set Statistics IO输出相关推荐

  1. 性能调优3:硬盘IO性能

    数据库系统严重依赖服务器的资源:CPU,内存和硬盘IO,通常情况下,内存是数据的读写性能最高的存储介质,但是,内存的价格昂贵,这使得系统能够配置的内存容量受到限制,不能大规模用于数据存储:并且内存是易 ...

  2. linux mysql io压力大_MySQL性能调优(四) Linux 磁盘IO

    1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...

  3. 性能调优:理解Set Statistics Time输出

    性能调优:理解Set Statistics Time输出 原文:性能调优:理解Set Statistics Time输出 在性能调优:理解Set Statistics IO输出我们讨论了Set Sta ...

  4. 理解统计信息(3/6):谁创建和管理统计信息?在性能调优中,统计信息的作用。...

    在理解统计信息(2/6):直方图 中,我们讨论了直方图,密度向量,还有SQL Server如何用统计信息做基数计算(cardinality estimation).这篇文章会讨论统计信息如何被创建,还 ...

  5. 深入理解JVM—性能调优

    在上文中我们分析了很多性能监控工具,介绍这些工具的目的只有一个,那就是找出对应的性能瓶颈.盲目的性能调优是没有效果的,只有充分知道了哪里出了问题,针对性的结果才是立竿见影的.解决了主要的性能问题,那些 ...

  6. 深入理解JVM性能调优

    深入理解JVM性能调优 您的评价:        收藏该经验     width="728" height="90" frameborder="0&q ...

  7. 服务器磁盘IO性能调优

    一.磁盘IO性能调优工具 1.iostat iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会 ...

  8. 深聊性能测试,从入门到放弃之:如何对IO进行性能调优

    1.引言 2. 硬盘知识 2.1 磁盘原理 2.2 磁盘接口 2.3 磁盘读写 2.4 磁盘KPI 2.5 计算 2.5.1 IOPS计算 2.5.2 传输速率/吞吐率计算 2.6 IO延时 2.6. ...

  9. 深入理解Java虚拟机:Jvm性能调优

    本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...

最新文章

  1. 移动设计需避免四种常见的用户体验失败
  2. Font Awesome-一款吊炸天的字体图标插件中文全介绍
  3. 【若依(ruoyi)】表格实现tooltip
  4. 一道数组求连续子集最大值的题目。
  5. acwing199.余数之和(除法分块)
  6. java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态
  7. php excel 函数,php实现excel中rank函数功能的方法
  8. 租号平台正在把“未成年”变成“大人”
  9. Python稳基修炼的经典案例9(计算机二级、初学者必会turtle库例题)
  10. 【Python】Scrapy入门实例
  11. Sqlserver自动优化
  12. 淡入淡出效果 (jQuery)
  13. 极客大学产品经理训练营:数据分析与用户数据 第17课总结
  14. Vue项目中Router路由中meta字段的妙用-案例
  15. 印度软件外包发展简记
  16. Pytorch|YOWO原理及代码详解(二)
  17. docker-compose 部署jmeter+grafana+prometheus/influxdb,构建性能测试可视化实时监控(二)...
  18. 中大新华计算机科学与技术,专业评估|信息科学学院电子信息科学与技术、计算机科学与技术、软件工程、数字媒体技术专业评估考察会议举行...
  19. 多任务的实现方式——“多进程”与“多线程”
  20. linux之cp/scp命令+scp命令详解---远程拷贝

热门文章

  1. html flash 动画效果代码大全,flash动作代码大全
  2. Java-String类型的参数传递问题
  3. word项目符号或编号bullets and numbering
  4. # # # 正则
  5. java Object解析
  6. 【转】Linux中多线程wait使用注意
  7. 解决Button设置disabled后无法执行后台代码问题
  8. 工作八年总结(转载)
  9. C,C++,C#的点评
  10. Session id的存储