sql2k8中的活动监视器允许我们查看最昂贵的查询.好的,这很酷,但有没有办法可以通过查询分析器记录此信息或获取此信息?我真的不想打开Sql Management控制台,而是查看活动监视器仪表板.
我想弄清楚哪些查询写得不好/架构设计不当等等.
谢谢你的帮助!
使用SQL Server Profiler(在SSMS中的工具菜单上)创建记录这些事件的跟踪:
RPC:Completed SP:Completed SP:StmtCompleted SQL:BatchCompleted SQL:StmtCompleted
您可以从标准跟踪模板开始并修剪它.您没有指定这是针对特定数据库还是整个服务器,如果是针对特定Db,则包括DatabaseID列并为您的DB(SELECT DB_ID('dbname')
)设置过滤器.确保每个事件都包含逻辑"读取数据"列.将跟踪设置为记录到文件.如果你要让这个跟踪在后台无人值守运行,最好设置一个最大跟踪文件大小,如果你有足够的空间,说500MB或1GB(这一切都取决于服务器上有多少活动,所以你将不得不吮吸它并看到).
简要地开始跟踪然后暂停它.转到文件 - >导出 - >脚本跟踪定义并选择您的数据库版本,并保存到文件.您现在有一个sql脚本,它创建的跟踪比通过分析器GUI运行的开销要少得多.当您运行此脚本时,它将输出跟踪ID(通常@ID=2
); 注意这一点.
获得跟踪文件(.trc)后(由于达到最大文件大小而完成跟踪,或者使用跟踪文件停止了运行跟踪)
EXEC sp_trace_setstatus @ID,0
EXEC sp_trace_setstatus @ID,2
您可以将跟踪加载到探查器中,或使用ClearTrace(非常方便)或将其加载到表中,如下所示:
SELECT * INTO TraceTable FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)
然后,您可以运行查询来聚合数据,例如:
SELECT COUNT(*) AS TotalExecutions, EventClass, CAST(TextData as nvarchar(2000)) ,SUM(Duration) AS DurationTotal ,SUM(CPU) AS CPUTotal ,SUM(Reads) AS ReadsTotal ,SUM(Writes) AS WritesTotal FROM TraceTable GROUP BY EventClass, CAST(TextData as nvarchar(2000)) ORDER BY ReadsTotal DESC
一旦确定了昂贵的查询,就可以生成并检查实际的执行计划.
以下脚本为您提供结果.
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1), qs.execution_count, qs.total_logical_reads, qs.last_logical_reads, qs.total_logical_writes, qs.last_logical_writes, qs.total_worker_time, qs.last_worker_time, qs.total_elapsed_time/1000000 total_elapsed_time_in_S, qs.last_elapsed_time/1000000 last_elapsed_time_in_S, qs.last_execution_time,qp.query_plan FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp ORDER BY qs.total_logical_reads DESC