`
baobaojinjin
  • 浏览: 141991 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用SQL Profiler处理开销较大的查询

 
阅读更多

  当SQL Server的性能变差时,最可能发生的是以下两件事:

  • 首先,某些查询产生了系统资源上很大的压力。这些查询影响整个系统的性能,因为服务器无法足够快速地服务其他SQL查询。
  • 另外,开销较大的查询阻塞了其他请求相同数据库资源的查询,进一步降低了这些查询的性能。优化开销较大的查询不仅改进它们本身的性能,而且减少数据库阻塞和SQL Server资源压力从而提高了其他查询的性能。

识别开销较大的查询

  SQL Server的目标是在最短时间内将结果集返回给用户。为此,SQL Server查询优化器生成一个成本效益高的查询执行计划。查询优化器计算许多因素的权重,包括执行查询所需要的CPU、内存以及磁盘I/O的使用情况-这些均来自于由索引维护或过程中生成的统计。通常开销最低的计划有最少的I/O,因为I/O操作代价昂贵。

  逻辑读提供指出了查询产生的内存压力。它还提供了磁盘压力指标,因为内存页面必须在操作查询中被备份,在第一次数据访问期间写入,并且在内存瓶颈时被移到磁盘上。查询的逻辑读数量越大,磁盘压力的可能性就越大。过多的逻辑页面也增加了CPU用于管理这些页面的负载。

  导致大量逻辑读的查询通常在相应的大数据集上得到锁。即使读也需要在所有数据上的共享锁。这些查询阻塞了其他请求修改这些数据的查询,但是不阻塞读取数据的查询。因为这些查询固有的开销并且需要长时间执行,他们持续地阻塞其他查询。被阻塞的查询进一步阻塞查询,引入了数据中的阻塞链。

  识别开销较大的查询并优化它们有如下意义:

  •   增进开销较大的查询本身的性能;
  •   降低系统资源上的总体压力;
  •   较少数据库阻塞;

  其中开销较大的查询可以被分为如下两类:

  •   单词执行:查询的一次单独执行开销较大;
  •   多次执行:查询本身开销并不大,但是该查询的重复执行导致系统资源上的压力;

  1、单次执行开销较大的查询

  可以分析SQL Profiler跟踪输出文件来识别开销较大的查询。比如,如果对识别执行大量的逻辑读的查询感兴趣,应该在跟踪输出的Reads数据列上排序。

  •   捕捉表示典型工作负载的Profiler跟踪;
  •   将跟踪输出保存到一个跟踪文件;
  •   打开跟踪文件进行分析;
  •   通过事件选择选项卡,单击组织列按钮,在Reads列上分组跟踪输出。

  

  跟踪输出如下:

  

  在某些情况下,可能从系统监视器输出中识别CPU上的大压力。CPU上的压力可能是因为大量CPU密集型操作,如存储过程重编译、总计函数、数据排序、哈希连接等。在这种情况下,应该在CPU列上排序Profiler跟踪输出以识别使用大量处理器周期的查询。

  2、多次执行开销较大的查询

  有时候一个查询可能本身开销并不大,但是同一查询多次执行的累积效应可能造成系统资源的压力。在Reads列上排序对识别这种类型的查询没有帮助。如果希望知道查询的多次执行进行的总读取数,不幸的是Profiler在这里不能直接提供帮助,但是仍然可以用以下方法得到这一信息。

  •   在Profiler中跟踪输出的以下列上分组:EventClass、TextData和Reads。对于相同EventClass和TextData的分组,手工计算所有对应的Reads的总和。
  •   在Profiler中选择文件=》另存为=》跟踪表将输出到一个跟踪表。也可以使用内建函数fn_trace_gettable和Profiler的跟踪文件输出导入到一个跟踪表。
  •   访问sys.dm_exec_query_stats DMV从生产服务器上检索信息。这假设打算处理一个即时的问题并且不关注历史问题。

  在将跟踪输入保存到文件以后,先将跟踪数据导入到一张表:

SELECT * INTO TraceTable
FROM ::fn_trace_gettable('D:\123.trc',default)

  然后执行以下语句:

复制代码
SELECT COUNT(*) AS TotalExecutions,EventClass,
CAST(TextData AS NVARCHAR(MAX)) TextData,
SUM(Duration) AS Duration_Total, 
SUM(CPU) AS CPU_Total, SUM(Reads) AS Reads_Total, 
SUM(Writes) AS Writes_Total 
FROM TraceTable 
GROUP BY EventClass,CAST(TextData AS NVARCHAR(MAX)) 
ORDER BY Reads_Total DESC
复制代码

  脚本中的TotalExecutions列指出了查询被执行的次数,Reads_Total列指出了该查询多次执行所进行的读操作的总数。注意NTEXT不支持GROUP BY,因此要转换一下类型。

  这个方法识别出来的开销较大的查询比Profiler识别出的单次执行的开销较大查询更好地指出了负载。例如,一个需要50个读操作的查询可能执行1000次。这个查询本身被认为足够经济了,但是执行的读操作总是是5万,这不能被认为是经济的。优化这个查询降低读操作数,即使每次执行减少10次,读操作数也将降低1万次。这比优化一个5千次读操作的查询更有利。

  从sys.dm_exec_query_stats视图中得到相同的信息只需要一个查询:

复制代码
SELECT ss.sum_execution_count
,t.TEXT
,ss.sum_total_elapsed_time
,ss.sum_total_worker_time
,ss.sum_total_logical_reads
,ss.sum_total_logical_writes
FROM (SELECT s.plan_handle
,SUM(s.execution_count) sum_execution_count
,SUM(s.total_elapsed_time) sum_total_elapsed_time
,SUM(s.total_worker_time) sum_total_worker_time
,SUM(s.total_logical_reads) sum_total_logical_reads
,SUM(s.total_logical_writes) sum_total_logical_writes
FROM sys.dm_exec_query_stats s
GROUP BY s.plan_handle
)AS ss
CROSS APPLY  sys.dm_exec_sql_text(ss.plan_handle) t
ORDER BY sum_total_logical_reads DESC
复制代码

  这比所有收集跟踪数据所需要的工作要容易得多,那么为什么还要使用跟踪数据?使用跟踪的主要原因是精确性。sys.dm_exec_query_stats视图是给定计划已经存在于内存中时的流动总计,时间点并不精确。另一方面,跟踪是运行的任何时间段的历史记录。甚至可以在数据库中加入跟踪,并且拥有一系列可以比依靠给定的瞬间更精确地生成总计的数据。但是对定位性能问题的理解关注是查询运行缓慢的时点,这是sys.dm_exec_query_stats不可替代的场合。

  3、识别运行缓慢的查询

  如果运行缓慢的查询的响应时间变得不可接受,那么应该分析性能下降的原因。但是不是所有运行缓慢的查询都是由于资源问题造成的,其他需要关心的因素如阻塞也可能导致缓慢的查询。

  为了发现运行缓慢的查询,在Duration列上分组跟踪输出。

  

  跟踪输出如下:

  

  对于运行缓慢的系统,应该注意优化过程前后运行缓慢的持续查询时间。应用优化技术之后,应该计算在系统上的总体性能。优化步骤可能负面地影响其他查询,使其变慢。

分享到:
评论

相关推荐

    sqlprofiler.jar

    结合SQL Profiler进行图形化监控与使用 1、下载SQL Profiler的文件包进行安装。 2、把p6spy.jar及sqlprofiler.jar放到WEB-INF/lib目录下,将SQL Profiler自带的spy.properties覆盖原来的classes目录下文件 3、修改 ...

    sql2005 express SqlProfiler

    SQL 指令,但是在 SQL Server 2005 Express 版本中並沒有提供 SQL Server Profiler 工具,只有 SQL Server 2005 標準版以上才有此工具,所以不是所有開發人員都能夠享受到 SQL Server Profiler 的強大功能。...

    SQL Profiler下载

    SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询; 在后台收集查询信息; 分析性能; 诊断像死锁之类的问题; 调试T-SQL语句; 模拟重放SQL Server活动; 也可以使用...

    sqlprofiler-0.3 sql查询分析工具

    sqlprofiler-0.3 sql查询分析与工程集成,用于系统调试优化,带查询参数值,sql查询资源占用图形分析。

    SQL Server 2005 SQL Profiler

    SQL Server 2005 SQL Profiler SQL Server 2005 SQL Profiler SQL Server 2005 SQL Profiler SQL Server 2005 SQL Profiler

    SQL Profiler教程

    SQL Profiler 教程,监管SQL执行效率

    p6spy_sqlprofiler-0.3-bin.zip

    用p6spy+sqlprofiler 监控sql 的所有文件和包

    使用sql server Profiler监听应用程序执行的sql

    Sqlserver Profiler是DBA进行sql监控和调优时必用的一大利器。不过,对于开发人员来说,能够监控到程序运行时的sql,对于排障已经相当方便了。

    AnjLab.SqlProfiler数据库跟踪

    SQL 事件探查器是从服务器捕获 Microsoft® SQL Server™ 2000 事件的工具。事件保存在一个跟踪文件中,可在以后对该文件进行分析,也可以在...SQL 事件探查器用于以下活动: 逐步分析有问题的查询以找到问题的原因。

    SQL Profiler 模板配置和简单的使用

    SQL Profiler 模板配置和简单的使用 跟踪模板设置,设置之后以后都可以使用此模板 简单的设置跟踪条件,筛选条件

    SQL SERVER 2005/2008 Express Profiler

    十分好用的sql server profiler 事件跟踪器

    SQL 调试工具 - Express Profiler

    SQL 自带的 SQL Profiler首先是standard版本才有,所以不是免费的,还有就是设置起来太麻烦,后来又搜了SqlExpressTrace,也是要配置。还是这个Express Profiler好,打开就用,很快就能监测到你的Sql是怎么跑的了。

    p6spy_sqlprofiler

    专门用来监控hibernate的sql输出,进行调试应用程序的工具,找了好久才找到,里面有个配置文件,记住realdriver是你的驱动,而在hibernate设置的驱动是这个驱动代理,p6spy的驱动,相当于在hibernate和数据库之间放...

    SqlProfiler的替代品-ExpressProfiler

    SQL SERVER 2008的事件探查器(SQL SERVER PROFILEr),方便我们对系统优化前后速度与性能的对比。SqlExpressProfiler for 2008事件探查器,可以查看数据库的事件,执行后的sql语句.

    sqlprofiler2008

    1.sqlprofiler 支持sql2008 和 sql2008serverR2 2.安装起来也挺方便的。

    sqlserver2000 事件探查器profiler

    用于SQL server2000自带的探查器不能用的 替换一下就行了 监视 SQL Server 实例的性能。 调试 Transact-SQL 语句和存储过程。 识别执行慢的查询。 在工程开发阶段,通过单步执行语句测试 SQL 语句和存储过程,以确认...

    SqlServer性能工具Profiler 介绍

    在企业管理器界面(已连接到相关数据库)依次打开:tool —> SQLServer Profiler —> New Trace(新建跟踪器)—> 链接到相应数据库服务器(connect)—> 运行跟踪(run)—> Clear Trace Window()清除跟踪窗口—>。...

    SQL Server Profiler

    SQL Server Profiler 設定步驟

    SQL Server Profiler 模板说明

    SQL Server Profiler 跟踪模板说明(C+V)

Global site tag (gtag.js) - Google Analytics