你怎样确定你的应用程序执行的怎么样?你可以使用什么工具?每一个开发人员需要确定每一条应用程序TSQL语句是最优的。通过调整每一个查询你可以确定你的应用程序运行得尽可能的高效。你使用开发环境时更容易对应用程序的代码进行修改。一旦你的代码已成为了产品那么要做修改以优化你的代码就可能需要很长的时间,或甚至是不可能的。这就是为什么你需要在应用程序开发过程中定期检查你的应用程序代码的执行情况。本篇文章将讲述关于怎样确定运行较慢的查询的一些不同方法,并提供给你一些小技巧用于在你反复修改每一个查询来试图改进性能的时候监控你的查询性能。

  怎样确定运行较慢的查询

  有了SQL Server 2005你就有了两个不同的选择。第一个选择,就是在其它SQL Server版本中也可用的SQL Server Profiler。而使用SQL Server 2005你就有了“sys.dm_exec_query_stats” DMV。让我们看一下这两个选择怎样用来确定你的运行较慢的查询。

  SQL Server Profiler 是一个易于使用的GUI工具。Profiler 可以用来显示在一个SQL Server 实例上进行的CPU、I/O和SQL Server TSQL 语句的持续时间。为了使Profiler能够用于查找你运行较慢的查询,你需要创建和启动一个profiler跟踪。使用“新跟踪”项可以轻松地做到这一点。Profiler有一个“TSQL持续时间”模版,它可以用来查找你运行时间较长的查询。但是如果你想显示这些运行时间较长的查询所用的CPU和I/O,你将需要创建你自己的Profiler跟踪,或者修改使用“TSQL持续时间”模版所选择的字段。你可以修改“TSQL持续时间”模版:点击“事件选择”标签,然后点击“CPU”,“读”,或“写字段下面的复选框来选择CPU和I/O。要查看更多的关于怎样使用SQL Server Profiler的信息请参考在线书籍。

  如果你有SQL Server 2005,你也可以使用“sys.dm_exec_query_stats” DMV 来确定运行时间较长的查询。这个DMV 可以用来返回缓存查询计划的统计信息。下面是一个关于怎样返回一些针对每一个缓存计划的不同性能测量的示例。

以下是引用片段:
SELECT  creation_time  
        ,last_execution_time 
        ,total_physical_reads
        ,total_logical_reads  
        ,total_logical_writes
        , execution_count 
        , total_worker_time
        , total_elapsed_time 
        , total_elapsed_time /
execution_count avg_elapsed_time
        ,SUBSTRING(st.text,
(qs.statement_start_offset/2) + 1,
         ((CASE statement_end_offset 
          WHEN -1 THEN
DATALENGTH(st.text)
          ELSE
qs.statement_end_offset END 
            -
qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY total_elapsed_time / execution_count DESC;

  我使用这个查询计算了平均实耗时间,然后制定输出,所以具有最差的平均实耗时间的查询显示在第一个。实耗时间是一个用于确定执行较差的查询的较好测量,因为这是处理一个查询所要花费的实际时钟时间。

  通过使用profiler 或DMV查询你可以基于持续时间/实耗时间来确定你的执行很差的查询。一旦你确定了执行较差的查询然后你就可以全力优化这些查询。通过优化较差的查询你将获得最好的性能和以最小代价来改进你的应用程序整个性能。

  帮助优化查询的工具

  当优化查询时你需要在每一次变更之后重复地检查性能信息。进行这项检查使你可以确定你的修改是否起到了改进作用或使你的查询性能更差了。在确定你的查询性能方面有三个有用的测量:实耗时间、I/O和CPU。让我们看看针对一个给定查询测量这三个中每一个的不同方法。

  实耗时间

  一个查询运行所花费的时间叫做实耗时间,也是大家所知道的时钟时间。很多东西会影响查询的实耗时间。实耗时间是测量一个查询执行的怎么样的极好的基准测量,因为它测量了一个用户在SQL server 处理一个特定的查询时要等多久。那么你有哪些不同的方法来测量一个TSQL语句的实耗时间呢?

  你可以使用的第一个方法是当执行一个批处理文件时“实耗时间”会在SQL Server管理套件的查询窗口中显示出来。这是我将等待的时间,如下面的截图所示:

  这里我执行了一个循环1亿次添加1。注意我等待的实耗时间是以红色显示在左下角落。如果你在SSMS中运行你的较慢查询,那么你可以使用这个实耗时间显示作为一个对确定你的查询会运行多长时间的一个测量。每一次你改变你的查询和重新运行它,你都可以查看这个时间来确定你的查询是否运行得快些了。

现在另一个测量实耗时间的方法是使用一个SET
STATISTICS命令来显示一个查询的实耗时间。下面是一个截屏,它显示了我的查询窗口中执行的每一个语句在查询结果面板中的实耗时间统计信息:

  这里我在运行我的简单SELECT语句之前执行了“SET STATISTICS TIME ON”语句。注意“实耗时间”统计在结果面板中显示出来,还有“CPU时间”,以及我的PRINT 语句的输出。“SET STASTISTICS TIME ON”语句显示了解析、编译和执行每一条语句所花费的时间。如果你只执行少量的语句,那么这个语句是很有用的。如果你执行大量的语句,类似于我的第一个循环示例,那么输出的行数将是非常多的,以致难以阅读。

  现在你有时需要测量在一个批处理文件中执行不同的大块代码所花费的时间,而不只是一个指定的TSQL 语句。如果你有一个运行时间很长的大型脚本或存储过程,并且你想找出哪一部分运行时间最长,那么这会是很有用的。要为代码段创建实耗时间,我们可以使用下面的方法:

  在这你可以看到我运行了两个不同的简单循环。对于每一个循环,我计算进行这个循环所花费的时间。我将每一个代码块的起始时间放到一个叫做@START的变量里。然后当循环结束时我打印出@START DATETIME 变量和用GETDATE()函数获得的当前时间之间的差值。在我的例子里,第一个循环10,000次花费了16 ms ,而第二个循环90,000次花费了110秒。

  CPU时间

  另一个重要的性能测量是你的查询要返回一个结果集所需要的CPU数量。在上一节中,当我使用“SET STATISTICS TIME ON”语句时在一个批处理文件中显示每一条语句的CPU时间。所以这是你可以用来测量一条TSQL语句CPU消耗的第一个方法。但是,你怎么测量多个语句或者是不同代码块的CPU时间呢?

  SQL Server提供了@@CPU_BUSY系统变量,它用来测量CPU消耗。这是在线书籍上对这个变量的定义:返回SQL Server 从最后一次启动到目前的工作时间。结果就在COU时间增量上,或“标记”,并且是所有CPU时间的累积,所以它可能会超出实际的实耗时间。将它乘以@@TIMETICKS来转化为微秒。

下面的方法是你可以使用@@CPU_BUSY变量来测量在我前一个示例中每一个循环执行过程中SQL Server 所使用的CPU量。现在记住既然@@CPU_BUSY 包含从SQL Server 启动以来使用的CPU量,那么它就包括所有用户和系统在服务器上运行的查询所使用的CPU量。因此只有当只有你在这个系统上运行SQL Server命令而没有后台系统执行查询时,这个方法测量的CPU量才准确:

  如同你所看到的,我测量了第一个和第二个循环所使用的CPU毫秒时间。只是让你知道我运行了这个查询几次,获得的每次循环执行实际都不同。所以要注意,使用这个方法会受SQL Server上运行的其它东西影响。我想说的是这个方法对于测量实际的CPU使用不总是可靠的,但是如果你有一个具有较少活动的单独系统,那么它仍然是一个测量CPU消耗的方法。

  一个更精确测量CPU使用的方法是使用SQL Server profiler。它包括CPU字段,显示于不同的完成事件。这里有一个例子是关于我怎样使用SQL Server profiler来捕捉上面的循环批处理所使用的CPU量:

  这里我使用SQL:BatchCompleted 事件来捕捉CPU。默认情况下,SQL Profiler 以毫秒显示持续时间。使用“工具——选项”对话框,你可以将这个显示改为微秒。注意这个方法只能测量完整的批处理,而不能测量我的批处理中每一个循环的持续时间。

  I/O使用

  像其它的性能测量一样,也有一些方法显示一个TSQL
语句所使用的I/O数量。在SQL Server 中跟踪的有两个不同类型的I/O:逻辑IO和物理IO。逻辑I/O考虑从内存中的缓冲池进行处理的数据,因此叫做逻辑I/O。物理I/O是从SQL Server用来存储数据库的物理磁盘直接访问数据所关联的I/O。物理I/O是更加昂贵的I/O,意思是说它们花费更长的时间来处理。一般情况下I/O是最昂贵的单一操作,它影响一个TSQL语句的整个性能。所以当你调整你的查询时,你要将执行以生成一个结果集的逻辑I/O和物理I/O操作的数目降低到最小。

一个显示某TSQL 语句或语句批处理文件所关联的I/O 数量的方法是使用“SET STATISTICS IO ON”语句打开I/O 统计信息收集过程。当你在连接时执行这条语句,你将输出用于解决你的TSQL 语句的I/O 数目。下面的例子是我使用“SET STASTISTICS IO ON”语句来显示解决一个对AdventureWorks数据库的简单查询所需要的I/O 数目:

  在这你可以看到我的SELECT 语句执行2 “logical reads”,和2
“physical reads”。现在当我第二次运行这个语句批处理时我会得到下面的输出:

  这里你将注意到第二次我执行我的TSQL
SELECT语句时它只要求2 “logical reads”和0 “physical reads”,这是因为保持了这个查询的AdventureWorks 页面已经缓存在了缓冲池中。如果你进行重复测试试图改进你的查询性能,你需要确保你除去了因为你的查询已经存在于缓冲器缓存中而在页面请求时会发生的I/O计数差异。为了消除这个计数问题,你可以在运行每一个测试之前执行“DBCC
DROPCLEANBUFFER”命令。这将使你的查询运行时具有一个干净的缓冲池而不必停止和重启SQL
server。

  另一个跟踪查询I/O的方法是使用SQL Server Profiler。要这么做,只要在确定你的跟踪所要监控的事件和字段时确保你包含了I/O相关的字段。

  总结

  能够跟踪你不同查询的资源消耗情况是监控你的应用程序的一个关键之处。知道什么TSQL语句在使用最多的资源可以帮助你确定在优化你的应用程序时要关注什么。“sys.dm_exec_query_stats” DMV 帮助数据库管理员快速确定这些使用最多资源的TSQL语句。使用各种“SET”语句、系统变量和/或SQL
Server Profiler 事件/字段可以帮助你测量你的问题TSQL语句的CPU、I/O和消耗时间。确定、测量和改进你的应用程序查询性能将帮助你优化你应用程序背后的代码。

文章出处:http://database.ctocio.com.cn/tips/159/7771659.shtml

测量TSQL语句的性能的更多相关文章

  1. 部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程)

    部分具有统计功能的TSQL语句(例如DBCC语句,全局函数,系统存储过程) 这些功能也能帮助用户了解和监控SQLSERVER的运行情况 DBCC语句,DBCC语句是SQL2005的数据库控制台命令 D ...

  2. DBA工具——DMV——如何知道TSQL语句已运行了多久

    原文:DBA工具--DMV--如何知道TSQL语句已运行了多久 DBA通常想知道正在运行的语句已经执行了多久了?可以使用Sqlserver profiler来捕获语句的开始时间,和现有时间比较,但是在 ...

  3. MSSQL·查询T-SQL语句执行时间的三种方法

    阅文时长 | 0.23分钟 字数统计 | 420.8字符 主要内容 | 1.引言&背景 2.自定义时间变量求差法 3.MSSQL内置方法 4.MSSQL选项开启时间统计 5.声明与参考资料 『 ...

  4. 数据库基础及T-SQL语句

    字符类型: int 整型float 小数double 小数varchar(20) 字符串bit 布尔型数据datetime 日期时间类型text 长文本 (以下两种不经常使用) money 存货币im ...

  5. T-SQL语句简易入门(第一课)

    在微软官方,有一篇介绍T-SQL语句的教程,非常好理解,完全可以帮助新手入门,了解常用SQL语句的使用语法,而且又不涉及较为复杂的操作.不用安装示例数据库AdventureWorks.下面是教程里内容 ...

  6. 答:SQLServer DBA 三十问之六:Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息;

    6. Job信息我们可以通过哪些表获取:系统正在运行的语句可以通过哪些视图获取:如何获取某个T-SQL语句的IO.Time等信息: 我的MSDB数据库中有全部的表: sys.all_columns,s ...

  7. 数据库---T-SQL语句提纲

    T-SQL语句: 创建表:create table Name(Code varchar(50)) 主键:primary key自增长列:auto_increment外键关系:references非空: ...

  8. T-sql语句中GO的作用及语法【转】

    1. 作用: 向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号.2. 语法:一批 Transact-SQL 语句GO如Select 1Select 2Select ...

  9. MS SQL Server 如何得到执行最耗时的前N条T-SQL语句-

    --得到最耗时的前N条T-SQL语句 --适用于SQL SERVER 2005及其以上版本 --给N赋初值为30 ;with maco as ( select top (@n) plan_handle ...

随机推荐

  1. C++类前置声明

    cpp前置声明: 前置声明只能作为指针或引用,不能定义类的对象,也不能调用对象中的方法. 详见:https://www.cnblogs.com/dobben/p/7440745.html

  2. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_8_字符串的分割方法

    使用空格分割 这个参数其实是个正则表达式 如果用英文的句号来切分就会有问题.. 没有输出任何东西 输出他的长度看下 数组的长度输出为0 注意事项:

  3. python常用包官网

    Pandas http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.reset_index.html?high ...

  4. 练习4-python+selenium+pandas

    最近对于python的第三方库pandas比较有兴趣,在学习的过程中也简单的结合selenium做了一个简单的小工具 最新公司用一个外部系统来记录,追踪BUG,可是这个系统并不是专业的BUG管理系统, ...

  5. TensorFlow学习笔记6-数值计算基础

    TensorFlow学习笔记6-数值计算 本笔记内容为"数值计算的基础知识".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的矩阵,其大小为m ...

  6. 时间同步,使用oracle自带的ctss

    crsctl check ctss  --observer mode cluvfy comp clocksync   -检查crss为啥没启用 根据不同版本删除ntp的配置和服务 AIX: stops ...

  7. Redux 中间件与函数式编程

    为什么需要中间件 接触过 Express 的同学对"中间件"这个名词应该并不陌生.在 Express 中,中间件就是一些用于定制对特定请求的处理过程的函数.作为中间件的函数是相互独 ...

  8. Git利用命令行提交代码步骤

    利用命令行提交代码步骤进入你的项目目录1:拉取服务器代码,避免覆盖他人代码git pull2:查看当前项目中有哪些文件被修改过git status具体状态如下:1:Untracked: 未跟踪,一般为 ...

  9. Java 类在 Tomcat 中是如何加载的?

    作者 :xingoo https://www.cnblogs.com/xing901022/p/4574961.html 说到本篇的Tomcat类加载机制,不得不说翻译学习Tomcat的初衷. 之前实 ...

  10. HDU 6468 /// DFS

    题目大意: 把 1~15 的数字典序排序后为 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9 此时给定 n k, 求1~n的数组字典序排序后 第k个 ...