如何logging和查找最昂贵的查询?

sql2k8中的活动监视器允许我们查看最昂贵的查询。 好吧,这很酷,但有没有办法我可以login这个信息或通过查询分析器得到这个信息? 我真的不想打开Sqlpipe理控制台,我看着活动监视器仪表板。

我想弄清楚哪些查询写得不好/架构devise不好等等。

感谢堆的任何帮助!

  1. 使用SQL Server Profiler(在SSMS中的工具菜单上)创build一个logging这些事件的跟踪:

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

  3. 简单地开始追踪,然后暂停。 转到文件 – >导出 – >脚本跟踪定义,并select您的数据库版本,并保存到一个文件。 您现在有了一个sql脚本,可以创build比运行profiler GUI的开销less得多的跟踪。 当你运行这个脚本时,它将输出跟踪ID(通常@ID=2 )。 注意这一点。

  4. 一旦有跟踪文件(.trc)(由于达到最大文件大小而完成的跟踪,或者使用停止正在运行的跟踪

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

你可以将trace加载到profiler中,或者使用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 

我以前从来没有听说过这个工具,但是微软提供了一系列的报告,能够为您提供完美的报告 – 包括最慢的查询。 查看他们的性能仪表板报告 。

不知道他们是SQL 2008兼容,但值得检查。

SQL Server Profiler会做你所需要的吗? 我还没有使用2008年,所以我不知道该工具是否仍然在那里,但如果是这样,我相信你可以设置一个跟踪logging查询符合特定的标准(如那些执行和驱动CPU以上一定的门槛)。

我们已经在我们的项目中使用了它,它在帮助我们解决执行不佳的查询方面做得相当不错(尽pipe不要全职工作,依靠一般的Windows性能计数器来进行性能健康跟踪)。

有一个新的工具,SQL Server 2008中的Performance Studio ,它build立在由服务器自动维护的dynamicpipe理视图的基础之上,提供服务器性能的概述。 值得一试。

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