灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2947回复:0

[SQL Server]SQL SERVER性能调优之四(使用Profiler捕获慢查询)

楼主#
更多 发布于:2012-09-04 18:05

SQL SERVER性能调优之四(使用Profiler捕获慢查询)

(一)慢的标准是什么?
1、对于OLTP系统来说,用户等待3秒就失去耐心了,当然这是一个上限标准,系统的响应时间当然是越快越好。
2、对于OLAP系统来说,这个标准很难确定,我所在的公司,有些复杂的报表需要在一台强劲的服务器上运行一天,但是用户也可以接受。
3、所以我们应该关注OLTP系统的慢查询,不能让客户下订单需要10S以上才响应吧。
(二)捕获方法
1、首先在SSMS,工具菜单下打开Profiler。
2、输入你用户名密码登陆。 www.atcpu.com  
3、为你的跟踪取一个名字。
4、事件选择选择,选择以下两列即可,
Stored Procedures RPC:Completed
TSQL                      SQL:BatchCompleted
5、点击列筛选器,为Duration设置一个过滤值。本例子设置为3000(即3S)。
6、点击运行。开始信息的收集。
(三)优化捕获方法
虽然可以采用以上方法收集慢查询,但是跟踪也会对服务器造成额外的开销。
所以推荐在后台收集。可以在Profiler界面选择文件-》导出-》编写跟踪定义的脚本-》用于SQL 2005-2008.
代码如下:

/****************************************************/
/* Created by: SQL Server 2008 Profiler             */
/* Date: 2012/04/29  18:59:08         */
/****************************************************/

-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL
if (@rc != 0) goto error

-- Client side File and Table cannot be scripted
  www.atcpu.com  
-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 17, 1, @on
exec sp_trace_setevent @TraceID, 17, 9, @on
exec sp_trace_setevent @TraceID, 17, 6, @on
exec sp_trace_setevent @TraceID, 17, 10, @on
exec sp_trace_setevent @TraceID, 17, 14, @on
exec sp_trace_setevent @TraceID, 17, 11, @on
exec sp_trace_setevent @TraceID, 17, 12, @on
exec sp_trace_setevent @TraceID, 10, 15, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 1, @on
exec sp_trace_setevent @TraceID, 10, 9, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 2, @on
exec sp_trace_setevent @TraceID, 10, 10, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 11, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 6, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 12, 15, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 9, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 6, @on
exec sp_trace_setevent @TraceID, 12, 10, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 18, @on
exec sp_trace_setevent @TraceID, 12, 11, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 201027c7-ca0b-4ae3-ad06-9be3ed6ce0aa'
set @bigintfilter = 3000000
exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter

-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1
  www.atcpu.com  
-- display trace id for future references
select TraceID=@TraceID
goto finish

error:
select ErrorCode=@rc

finish:
go


(四)分析慢查询
1、 对于SQL DBA来说可以总是习惯用SQL语句在解决问题。
可以用如下语句以结果集形式返回Trace信息。
select * from fn_trace_gettable(N'c:\MyTrace.trc',-1)
2、可以将结果插入一个表中,分析慢查询语句的执行频率,调整写法或者优化索引在逐个解决。







喜欢0 评分0
游客

返回顶部