SQL Server提供了以下工具(SET选项)来支持查询的监测:

IO统计

TIME统计

PROFILER统计

XML统计

1. IO统计

当这个选项开启的时,对一批查询中的每一个数据对象访问的查询都有单独一行的输出(不进行数据访问的查询语句不会产生任何输出,比如PRINT、SELECT变量的值或调用系统的方法)

当IO统计选项启用时,会输出逻辑读的次数、物理读的次数、预读的次数和扫描计数。

启用IO统计:SET STATISTICS IO ON;

禁用IO统计:SET STATISTICS IO OFF;

逻辑读

指处理查询所需访问页的次数,对于任何给定的读取操作,数据缓存中的每一页都会被读取,所以如果查询是SELECT * FROM Tbl10 WHERE ID < 5时逻辑读也是10,因为这10页数据已经在缓存中了,因为数据缓存中的页来自磁盘,此值总是至少和物理读的值一样大,但通常比物理读的值大。

物理读

指从磁盘读取的页数,该值总是小于或等于逻辑读的值。

缓存命中率 = (逻辑读-物理读)/逻辑读

物理读的次数可以差别很大,第二次以及后续执行时物理读的次数会大幅减少,因为缓存在第一次执行时就完成了加载。

预读

值在处理某个查询时,运用预读机制读到缓存的页数。

扫描计数

显示了表被访问的次数

可以通过select * from  sys.dm_exec_requests where session_id = @@SPID查询granted_query_memory的值。

IO统计优化示例:

创建示例表,表被设计成每一行占用一页。

IF OBJECT_ID('dbo.Tbl1000') IS NOT NULL DROP TABLE dbo.Tbl1000;
CREATE TABLE dbo.Tbl1000(
  Id INT IDENTITY(1,1),
  Val INT,
  Fill CHAR(7000) NOT NULL DEFAULT REPLICATE('Fill',1750)
);
 
INSERT INTO dbo.Tbl1000(Val)
SELECT TOP(1000) 1+ROW_NUMBER()OVER(ORDER BY (SELECT 1))%100
FROM sys.all_columns A, sys.all_columns B, sys.all_columns C;

启用IO统计,执行查询:

SET STATISTICS IO ON;
GO SELECT * FROM Tbl1000 WHERE ID < 6
GO SET STATISTICS IO OFF;
GO

IO统计,表被扫描一次,逻辑读为1000,因为表一共有1000页。

(1000 row(s) affected)
Table 'Tbl10'. Scan count 1, logical reads 1000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

由于表没有索引,所以做了一次全表扫描,创建一个聚集索引

CREATE CLUSTERED INDEX Tbl1000_Id ON Tbl1000(Id);

重新执行SELECT * FROM Tbl1000 WHERE ID < 6;

(5 row(s) affected)
Table 'Tbl1000'. Scan count 1, logical reads 9, physical reads 0, read-ahead reads 6, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

逻辑读为9,这说明添加合适的聚集索引减少了很大一部分的不必要读。

2. TIME统计

SET STATISTICS TIME ON

显示分析、编译和执行各语句所需的毫秒数。

下面的示例显示服务器的执行、分析和编译时间。

USE AdventureWorks2012;
GO
SET STATISTICS TIME ON;
GO
SELECT ProductID, StartDate, EndDate, StandardCost
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET STATISTICS TIME OFF;
GO

下面是结果集:

SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms. (269 row(s) affected) SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.

SQL Server监测查询性能的更多相关文章

  1. SQL Server 2016 查询存储性能优化小结

    SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...

  2. Performance Monitor4:监控SQL Server的IO性能

    SQL Server的IO性能受到物理Disk的IO延迟和SQL Server内部执行的IO操作的影响.在监控Disk性能时,最主要的度量值(metric)是IO延迟,IO延迟是指从Applicati ...

  3. Sql Server参数化查询之where in和like实现详解

    where in 的参数化查询实现 首先说一下我们常用的办法,直接拼SQL实现,一般情况下都能满足需要 string userIds = "1,2,3,4"; using (Sql ...

  4. 【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参

    转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/29/2475427.html 在上一篇Sql Server参数化查询之where in和li ...

  5. 【转】Sql Server参数化查询之where in和like实现详解

    转载至:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARINDE ...

  6. SQL Server添加MDW性能监控报表(转载)

    10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...

  7. 优化SQL Server数据库查询方法

    SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...

  8. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...

  9. 【转载】Sql Server参数化查询之where in和like实现详解

    文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where ...

随机推荐

  1. fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)

    fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...

  2. mysql case when 条件过滤

    [1].[代码] 使用CASE WHEN进行字符串替换处理 跳至 [1] [2] [3] [4] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...

  3. MPAndroidChart 的实现

    效果图: 代码实现: package com.jiahao.me; import java.util.ArrayList; import java.util.List; import android. ...

  4. Java网页数据采集器[下篇-数据查询]【转载】

    本期概述 上一期我们学习了如何将html采集到的数据存储到MySql数据库中,这期我们来学习下如何在存储的数据中查询我们实际想看到的数据. 数据采集页面 2011-2012赛季英超球队战绩 如果是初学 ...

  5. Js Pattern - Namespace Pattern

    bad code // BEFORE: 5 globals // Warning: antipattern // constructors function Parent() {} function ...

  6. codeforces Gym 100500H H. ICPC Quest 水题

    Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...

  7. class、classLoader的getResourceAsStream的区别

    1.class.getResourceAsStream() 从源码中可以看出他也是调用ClassLoader的getResourceAsStream() public InputStream getR ...

  8. MySQL 列子查询及 IN、ANY、SOME 和 ALL 操作符的使用(转)

    MySQL 列子查询 列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如下: SELECT * FROM article WHERE uid I ...

  9. css 设置全屏背景图片

    <div id="div1"><img src="img.jpg" /></div> div#div1{ position: ...

  10. Linux解压/压缩命令——tar、gz、tar.gz、tgz、bz2、tar.bz2、Z、zip、rar、lha

    .tar 解包:tar -xvf FileName.tar 打包:tar -cvf FileName.tar DirName ——————————————— .gz 解压1:gunzip FileNa ...