当用Googlesearch这个问题的答案时,我find了这样长而复杂的指令,这个简短的参考链接就像这篇文章中的链接。
我正在寻找一个简洁的过程来生成执行时间> some_threshold的执行时间的SQL查询列表。
我想答案不在这里,因为它非常简单! 以下是我想到的:
File -> New Trace... RPC:Completed SQL:BatchCompleted 你可以通过ApplicationName , NTUserName等过滤如果你有很多的应用程序运行,并希望减less噪音。 你也可以只显示一些列,例如只是TextData和Duration 。
这是一个更高级的Profiler 处理 。
你可以使用它来获得前10名昂贵的查询(如果你在SQL Server 2005及以上):
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 -- logical reads -- ORDER BY qs.total_logical_writes DESC -- logical writes -- ORDER BY qs.total_worker_time DESC -- CPU time
使用Profiler跟踪,特别是在将跟踪导入数据库时,是一个很好的方法。
如果您正在使用SQL Server 2005或更高版本,DMV(dynamicpipe理视图)提供了另一种方法:
SELECT TOP 100 (total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO, (total_logical_reads + total_logical_writes) AS total_IO, qs.execution_count AS execution_count, SUBSTRING (qt.text,qs.statement_start_offset/2, (CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS indivudual_query, o.name AS object_name, DB_NAME(qt.dbid) AS database_name FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id where qt.dbid = DB_ID() ORDER BY average_IO DESC;
要记住的一件事是,当SQL Server启动时,DMV被清除,所以如果你的服务器已经启动了12分钟,它可能不会告诉你很多。 而且,它们是累积的 – 所以维护窗口(checkDB)可能会使数据倾斜。