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. Hibernate的配置

    配置Hibernate 1.在项目中引入Hibernate的Jar包 在 WebContent/WEB-INF/lib 目录下 导入jar包 2.在Java Resources 下创建 hiberna ...

  2. js奇葩错误 字符串传递问题

    第一种方式function hello(){    var name="he";    var content="<input type=button value= ...

  3. SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明

    在接触HibernateTemplate之前,我们知道,在对数据库进行CRUD操作之前,需要开启session.transaction等等.在hibernate学习过程中,我们知道了,得到sessio ...

  4. 音频视频播放(jquery中将jquery方法转化成js方法)

    在jQuery中没有音频视频直接播放的方法,我们在写音频视频时,应该将jquery的方法转化为js方法:play():pause() 补充:   将jq对象转化成js对象写法: var music=$ ...

  5. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  6. 【Winform】Winform 制作一键发布web

    前言 最近web网站有个需要,就是打包给客户,客户能够自己手动的进行傻瓜式的安装发布web.找了很多资料,其中涉及到 文件解压 IIS操作 数据库还原 等. 发现现在就主要是两种解决方案: ①:使用V ...

  7. 用c#读取并分析sql2005日志

    用过logExplorer的朋友都会被他强悍的功能吸引,我写过一篇详细的操作文档可以参考http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692. ...

  8. easyui textarea IE8中无法换行

    经查 原代码textarea 应用了"textbox"css样式. 默认 white-space:nowrap; 修改为 "nornal",问题解决.

  9. Java多线程中start()和run()的区别

    Java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thread对象所对应的方 ...

  10. i = i++;

    在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区.语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值):语句iload_1是将变量区中的值暂存如堆栈中. ...