【查询优化】怎样用SQL语句查看查询的性能指标
一、SET STATISTICS IO (有关TSQL语句查询所产生的磁盘活动量)
--显示有关由Transact-SQL 语句生成的磁盘活动量的信息
SET STATISTICS IO ON
--关闭有关由Transact-SQL 语句生成的磁盘活动量的信息
SET STATISTICS IO OFF
显示的信息如下:
(SQL语句为:select * from note500)
其中:
扫描计数:在查询中涉及到的表被访问的次数;
逻辑读取:从数据缓冲中读取的数据页数;
物理读取:从物理磁盘中往缓冲读取的数据页数;
预读:根据执行计划从物理磁盘中往缓冲读取的数据页数;
其中对于首次查询一般情况下会有一下关系:逻辑读取=物理读取+预读(其中的具体联系,由于已经在之前的博客文章中提到,就不再详细说明(文章名为【查询优化】MSSQL查询执行流程))
同理,后面的lob逻辑读取、物理读取、预读概念理解差不多,只是是对相应表进行更新或插入操作时体现。
对于扫描计数,以上图片的查询没有连接查询,因此意义不大。不过,如果连接查询来说,特别是循环查询那种,比如说自连接,如果循环次数越多,则扫描次数也就越多,则会使得查询的效率越低。这是扫描计数是一个比较重要的性能体现参数。
对于逻辑读取,由于SQLSERVER中对数据进行任何操作都要把数据读入到缓冲当中,如果逻辑读取的页数越多,则查询的性能越低。为此,逻辑读取一般都是查询性能体现的一个重要参数。
二、SET STATISTICS TIME (SQL Server解析和编译时间)
面显示的信息表明,执行这次查询使用了多少CPU运行时间和运行查询使用了多少时间。CPU运行时间是对运行查询所需要的CPU资源的一种相对稳定的测量方法,与CPU的忙闲程度没有关系。但是,每次运行查询时这一数字也会有所不同,只是变化的范围没有总时间变化大。总时间是对查询执行所需要的时间(不计算阻塞或读数据的时间),由于服务器上的负载是在不断变化的,因此这一数据的变化范围有时会相当地大。
总的来说,量化地来看一个查询语句的性能可以在几个参数进行比较:
1、CPU时间。比较查询所要占用的CPU资源时间;
2、I/O。可以比较查询的循环扫描次数和逻辑读取的数据量;