【QQ群】使用SQL PROFILER对性能影响

问题描述:

怎么捕获和记录死锁,大家知道SQL PROFILER对性能影响多大?

解决方案:

我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息。但这种方式有一个很大的敝端,就是消耗很大。据国外某大神测试,profiler甚至可以占到服务器总带宽的35%,所以,在一个繁忙的系统中,使用profiler显然不是一个好主意,下面我介绍两种消耗比较少的方法。其中第二种的消耗最小,在最繁忙的系统中也可使用。第一种最为灵活,可满足多种应用。

方法一:利用SQL Server代理(Alert+Job)

具体步骤如下:

1.首先使用下面的命令,将有关的跟踪标志启用。

DBCC TRACEON (3605,1204,1222,-1)


说明:  
3605 将DBCC的结果输出到错误日志。    
1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令。    
1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,SQL 2005及以上可用)。    
-1 以全局方式打开指定的跟踪标记。

以上跟踪标志作用域都是全局,即在SQL Server运行过程中,会一直发挥作用,直到SQL Server重启。    
如果要确保SQL Server在重启后自动开启这些标志,可以在SQL Server服务启动选项中,使用 /T 启动选项指定跟踪标志在启动期间设置为开。(位于SQL Server配置管理器->SQL Server服务->SQL Server->属性->高级-> 启动参数)    
在运行上面的语句后,当SQL Server中发生死锁时,已经可以在错误日志中看到了,但还不够直观(和其它信息混在一起)。(SSMS -> SQL Server实例 -> 管理 -> SQL Server日志)

2.建表,存放死锁记录

USE [Cole] --Cole是我的示例数据库,你可以根据实际情况修改。 
GO 
CREATE TABLE DeadLockLog ( 
id int IDENTITY (1, 1) NOT NULL,  
LogDate DATETIME,  
ProcessInfo VARCHAR(10),  
ErrorText VARCHAR(MAX) 
) 
GO

3.建立JOB

新建一个JOB(假设名称为DeadLockJob),在"步骤"中新建一步骤,随便写一个步骤名称,数据库为"Cole"(见2.建表),在"命令"栏中输入以下语句:

--新建临时表  IF OBJECT_ID(‘tempdb.dbo.#ErrorLog‘) IS Not Null  
DROP TABLE #ErrorLog 
CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX)) 

--将当前日志记录插入临时表  
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog 

--将死锁信息插入用户表  
insert DeadLockLog  
select a, b, c   
from #ErrorLog   
where id >= (select MAX(id) from #ErrorLog WHERE c Like ‘%Deadlock encountered%‘)     
DROP TABLE #ErrorLog

4.新建警报

在"新建警报"窗体的"常规"选项卡中,进行以下设置:    
名称:可根据实际自行命名,这里我用DeadLockAlert    
类型:选择"SQL Server性能条件警报"    
对象:SQLServer:Locks    
计数器:Number of Deadlocks/sec    
实例:_Total    
计数器满足以下条件时触发警报:高于值:0

设置完成后,应该如下图所示:

在"响应"选项卡中,选中"执行作业",并选择步骤3中我们新建的作业(即DeadlockJob)  
到这里为止,我们已经完成了全部步骤,以后,你就可以随时查询DeadLockLog表,来显示死锁信息了。

方法二:利用服务器端跟踪。

具体实现步骤如下:

1.编写如下脚本,并执行

-- 定义参数  
declare @rc int  
declare @TraceID int  
declare @maxfilesize bigint  
set @maxfilesize = 5  
-- 初始化跟踪  
exec @rc = sp_trace_create @TraceID output, 0, N‘e:\DbLog\deadlockdetect‘, @maxfilesize, NULL   
--此处的e:\dblog\deadlockdetect是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名  
if (@rc != 0) goto error 
-- 设置跟踪事件  
declare @on bit  
set @on = 1  
--下述语句中的148指的是locks:deadlock graph事件(参见sys.trace_events),12指的是spid列(参见sys.trace_columns)  
exec sp_trace_setevent @TraceID, 148, 12, @on    
exec sp_trace_setevent @TraceID, 148, 11, @on  
exec sp_trace_setevent @TraceID, 148, 4, @on  
exec sp_trace_setevent @TraceID, 148, 14, @on  
exec sp_trace_setevent @TraceID, 148, 26, @on  
exec sp_trace_setevent @TraceID, 148, 64, @on  
exec sp_trace_setevent @TraceID, 148, 1, @on 
-- 启动跟踪  
exec sp_trace_setstatus @TraceID, 1 
-- 记录下跟踪ID,以备后面使用  
select TraceID = @TraceID  
goto finish 
error:   
select [email protected] 
finish:   
go

运行上述语句后,每当SQL Server中发生死锁事件,都会自动往文件e:\DbLog\deadlockdetect.trc中插入一条记录。

2.暂停和停止服务器端跟踪

如果要暂停上面的服务器端跟踪,可运行下面的语句:

exec sp_trace_setstatus 1, 0 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为0,即暂停

如果要停止上面的服务器端跟踪,可运行下面的语句:

exec sp_trace_setstatus 1, 2 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为2,即停止

3.查看跟踪文件内容

对于上面生成的跟踪文件(e:\DbLog\deadlockdetect.trc),可通过两种方法查看:    
1).执行t-sql命令

select * from fn_trace_gettable(‘e:\DbLog\deadlockdetect.trc‘,1)

结果中的TextData列即以XML的形式返回死锁的详细信息。

2).在SQL Server Profiler中打开。    
依次 进入Profiler -> 打开跟踪文件 ->选择e:\DbLog\deadlockdetect.trc,就可以看到以图形形式展现的死锁信息了。

时间: 2024-10-24 00:04:20

【QQ群】使用SQL PROFILER对性能影响的相关文章

SQL Profiler工具简介

SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问题: 调试T-SQL语句: 模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profiler跟踪 从开始=>所有程序=>Microsoft SQL Server 2008=>性能工具打开Profiler工具,也可以打开S

oracle数据库性能影响之Sql parse

1,Sql parse的种类 Sql parse又通常分为硬解析和软解析,当sql第一次执行的时候,会发生硬解析,之后的执行如果在shared pool中能找到就是软解析.因此,为提高数据性能,尽可能的让每次执行的SQL在shared pool找到. 2,SQL在哪些情况下会发送硬解析? 1)统计信息改变  2)Sql中的表上有做ddl操作,包括grant和revoke. 3)执行计划被踢出shared pool 4)开启了trace 5)绑定变量长度变化 6)启用outlin

[MySQL优化] -- 如何使用SQL Profiler 性能分析器

mysql 的 sql 性能分析器主要用途是显示 sql 执行的整个过程中各项资源的使用情况.分析器可以更好的展示出不良 SQL 的性能问题所在. 下面我们举例介绍一下 MySQL SQL Profiler 的使用方法: 首先,开启 MySQL SQL Profiler mysql> SELECT @@profiling; +-------------+ | @@profiling | +-------------+ | 0 | +-------------+ 1 row in set (0.0

SQL Server 技术讨论专用 QQ 群

强烈推荐 SQL Server 技术讨论专用 QQ 群 QQ 群号: 213291913 注意事项: 本QQ群仅限于交流 SQL Server 技术,请勿灌水,否则直接踢人. 进群后请将群昵称改为实名,便于大家交流,群昵称格式为:地区-姓名. 听从指挥.文明交流.快乐学习.

【性能诊断】二、单功能场景的性能分析(fiddler、SQL Profiler)

Fiddler fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,在诊断分析问题时,都有很大的帮助. 下载地址:http://www.telerik.com/download/fiddler 工作原理和使用说明可参考:http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html 当然我们如果

性能测试报告模板QQ群 522720170

点击链接加入QQ群 522720170(免费公开课.视频应有尽有):https://jq.qq.com/?_wv=1027&k=5C08ATe 1. 测试概要 1.1. 系统简介 简述本项目的背景介绍 针对迎接2008奥运,对用户新开发的带有2008域名的免费邮箱. 1.2. 测试环境 对测试服务器/客户端测试机的软硬件描述 服务器名称 硬件 软件 URL/IP 备注 前端 采集 DB 客户端 -- 1.3. 测试时间 描述本项目测试的起止时间 1.4. 测试用例执行情况 描述在性能测试过程中所

前端资料QQ群交流

转:https://github.com/jsfront/src/blob/master/qq.md 这本来是我QQ群内部的一份公共约定的日常交流规则,后来得到大伙的一致认可,并用实际行动来捍卫它,使我倍受感动. 后来想:传播使爱更有力量,阅读使内心更为坚强,沉淀使生活更为醇香,分享使人更为谦卑或快乐.因为快乐,所以分享. 知识资源来源于互联网,应该返回给互联网,使看到的每一个人受益,也可以供其它各个行业的群主参考. 规则会不断的修改调整,你不在是一个受益者,更是一个项目参与者内容规则的创造者,

监控和剖析数据库操作 -- P6Spy、SQL Profiler、IronTrack SQL 使用简介

在我们 Java 开发应用程序的过程中,难免会碰到系统的性能问题,特别在企业应用的开发过程中,都会与数据库进行打交道.当我们碰到数据库性能时,最有效的就是直接跟踪每一个 SQL 语句的执行情况,SQL 语句的优化.索引的优化往往也是最容易取得最直接的效果的. 下面,我们首先开始介绍 P6Spy 这个剖析工具,看它是如何无侵入性地进行数据库操作的监控与剖析. P6Spy P6Spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架.通过 P6Spy 我们可以对 SQL 语句进行拦截,相当

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

原文:利用SQL Profiler处理开销较大的查询 当SQL Server的性能变差时,最可能发生的是以下两件事: 首先,某些查询产生了系统资源上很大的压力.这些查询影响整个系统的性能,因为服务器无法足够快速地服务其他SQL查询. 另外,开销较大的查询阻塞了其他请求相同数据库资源的查询,进一步降低了这些查询的性能.优化开销较大的查询不仅改进它们本身的性能,而且减少数据库阻塞和SQL Server资源压力从而提高了其他查询的性能. 识别开销较大的查询 SQL Server的目标是在最短时间内将结