如何记录并查找最昂贵的查询?

时间:2008-11-03 04:02:56

标签: sql-server sql-server-2008 profiling

sql2k8中的活动监视器允许我们查看最昂贵的查询。好的,这很酷,但有没有办法可以通过查询分析器记录此信息或获取此信息?我真的不想打开Sql Management控制台,看着活动监视器仪表板。

我想弄清楚哪些查询写得不好/架构设计不合理等等。

感谢大家帮忙!

6 个答案:

答案 0 :(得分:64)

  1. 使用SQL Server Profiler(在SSMS的工具菜单上)创建记录这些事件的跟踪:

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. 您可以从标准跟踪模板开始并修剪它。您没有指定这是针对特定数据库还是整个服务器,如果是针对特定数据库,则包括DatabaseID列并为您的数据库设置过滤器(SELECT DB_ID('dbname'))。确保每个事件都包含逻辑“读取数据”列。将跟踪设置为记录到文件。如果你要让这个跟踪在后台无人值守运行,最好设置一个最大跟踪文件大小,如果你有足够的空间,说500MB或1GB(这一切都取决于服务器上有多少活动,所以你将不得不吮吸它并看到)。

  3. 简要启动跟踪然后暂停。转到文件 - >导出 - >脚本跟踪定义并选择您的数据库版本,并保存到文件。您现在有一个sql脚本,它创建的跟踪比通过分析器GUI运行的开销要少得多。运行此脚本时,它将输出跟踪ID(通常为@ID=2);请注意这一点。

  4. 获得跟踪文件(.trc)后(由于达到最大文件大小而完成跟踪,或者使用

    停止了运行跟踪)

    EXEC sp_trace_setstatus @ID,0
      EXEC sp_trace_setstatus @ID,2

  5. 您可以将跟踪加载到探查器中,或使用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
    

    一旦确定了昂贵的查询,就可以生成并检查实际的执行计划。

答案 1 :(得分:21)

以下脚本为您提供结果。

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 

答案 2 :(得分:4)

我之前从未听说过这个工具,但微软提供了一套报告,可以很好地为您提供这一点 - 包括最慢的查询。查看他们的Performance Dashboard Reports

不确定它们是否与SQL 2008兼容,但值得一试。

答案 3 :(得分:2)

SQL Server Profiler会执行您需要的操作吗?我还没有使用过2008,所以我不知道该工具是否还在​​那里,但如果是,我相信你可以设置跟踪来记录满足特定条件的查询(例如执行和驱动CPU的那些查询)一定的门槛。)

我们已经在我们的项目中使用了它,它在帮助我们解决执行不良的查询问题方面做得相当不错(尽管不要将它留在全职,依靠一般的Windows性能计数器进行性能健康跟踪)。 / p>

答案 4 :(得分:2)

SQL Server 2008中有一个新工具Performance Studio,它基于服务器自动维护的动态管理视图,可以概述服务器性能。值得一试。

答案 5 :(得分:0)

(DELL)Quest SQL Optimizer for SQL Server 9.0引入了Find SQL模块,允许用户在SQL Server中找到资源最密集的SQL。 https://support.quest.com/softwaredownloads.aspx?pr=268445262