如何识别sql server中的慢速查询?

当用Googlesearch这个问题的答案时,我find了这样长而复杂的指令,这个简短的参考链接就像这篇文章中的链接。

我正在寻找一个简洁的过程来生成执行时间> some_threshold的执行时间的SQL查询列表。

我想答案不在这里,因为它非常简单! 以下是我想到的:

  1. 打开SQL Server Profiler (在性能工具中)
  2. File -> New Trace...
  3. 连接到你的数据库
  4. 点击事件select标签
  5. 只select对应于SQL查询结束的事件:
    • RPC:Completed
    • SQL:BatchCompleted
  6. 点击列filter…
  7. 点击列表中的持续时间
  8. 展开大于或等于,并input您认为以毫秒为单位的“慢”的阈值时间
  9. 点击OK
  10. 点击运行

你可以通过ApplicationNameNTUserName等过滤如果你有很多的应用程序运行,并希望减less噪音。 你也可以只显示一些列,例如只是TextDataDuration

这是一个更高级的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)可能会使数据倾斜。