SQL Profiler识别长时间查询
在很多情况下需要监控长时间运行查询的结果,在一些时候数据库用户可能会抱怨执行查询的响应时间并不一致,有时快点,有时慢点,当查询慢的时候就会导致应用程序超时。通过SQL Server Profiler可以监控哪个查询的时间最长或哪个查询时间最短。使用SQL Server Profiler可以监控负荷中的数据库长时间运行的查询,使用SQL Profiler识别长时间查询包括四个步骤:确定监控、设置模板、跟踪、分析与调校。
- 确定监控
在监控之前需要确定两个问题:第一确定事件类;第二设置筛选器;
事件类必须与待分析的问题匹配,查询执行的时间显示在Duration列,通常使用的事件类如下:
Ø Stored Procedures-RPC:Completed:在完成远程过程调用时发生,该事件可以捕获客户端调用的存储过程。
Ø Stored Procedures-SP:StmtCompleted:指示存储过程中的 Transact-SQL 语句已完成执行。
Ø TSQL- BatchCompleted:表示存储过程内部的 Transact-SQL 语句完成时发生。
筛选器设置主要需要确定使用哪能些筛选器以及确定哪些阀值,目的是在跟踪运行时更好的收集准确数据。如何确定筛选器中的阀值是设置筛选器的重点,通常可以使用这种方法,首先测试系统处于小负荷状态下,各查询所消耗的时间,将所消耗的时间记录下来,假设查询消耗的时间绝对大部分都大于2秒,那么可以将该值定义为阀值,这样可以屏蔽查询时间少于2秒的查询,可以更好的收集数据。
- 设置模板
第一步:启动SQL Profiler,单击【文件】菜单,在下拉菜单中选择【新建跟踪】选项,弹出跟踪属性对话框。
第二步:在跟踪属性对话框中选择“常规”标签页,单击【使用模板】下拉框,选择“Standard(默认值)”选项。
第三步:在跟踪属性对话框中选择“事件选择”标签页,选择“Stored Procedures-RPC:Completed”、“Stored Procedures-SP:StmtCompleted”和“TSQL- BatchCompleted”事件类,如图所示。
第四步:设置阀值,单击【列筛选器】按钮,选择“Duration”选项,并设置其阀值大于50毫秒,如图所示。
第五步:单击【组织列】按钮,选择“Duration”选项,单击【向上】按钮,将其置顶,即在SQL Profiler显示界面上第一列显示为“Duration”的值,如图所示。
3) 跟踪
实例:首先创建一个表,代码如下:
CREATE TABLE test
(
num varchar(255),
soc int,
id int
)
然后向该表中添加100万条记录,代码如下:
DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1;
WHILE @rc <= @max
BEGIN
INSERT INTO TEST values(‘2012001’,90,@rc);
SET @rc = @rc + 1;
END
接着启动跟踪程序,再打开一个查询窗口,执行一个查询语句,代码如下:
select * from test
SQL Profiler跟踪结果如图所示。
“Duration”列显示查询的时间,依次从小到大升序排序,一般首先分析时间长的查询语句。
- 分析与调校
一般分析最后一行的数据,因为最后一行的数据是模拟脚本查询的语句,因些在该实例中先分析倒数第二行的数据,以分析倒数第二行数据为例,分析的工具一般使用SQL Server 2005 Database Tuning Advisor(DTA)。
在SQL Server Management Studio中新建一个查询窗口,输入如下查询语句:
select * from test
然后单击右键,选择“在数据库引擎优化顾问中分析查询”,如图所示。
之后弹出“Database Engine Tuning Advisor”对话框,如图所示。
单击“优化选项”标签页,可以对优化项进行详细的设置,之后单击【开始分析】按钮,分析结束后显示分析结果,分析可以得知,DTA建议为test表创建一个索引。
注意:如果调用DTA来分析查询,需要使用SQL Server身份认证在SQL Server Management Studio中连接SQL Server,这样在DTA管理界面单击“开始分析”之前必须重新连接到一个数据库实例,并选择需要调校的数据库,如果使用Windows身份验证,那么在分析时就会报错,因为它不会要求重新连接到一个数据库实例。