17

如何找到 SQL Server 2008 中性能最差的查询?

我找到了以下示例,但它似乎不起作用:

SELECT TOP 5 obj.name, max_logical_reads, max_elapsed_time
FROM sys.dm_exec_query_stats a
CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd
INNER JOIN sys.sysobjects obj on hnd.objectid = obj.id
ORDER BY max_logical_reads DESC

摘自:

http://www.sqlservercurry.com/2010/03/top-5-costly-stored-procedures-in-sql.html

4

4 回答 4

28

基于...的前 10 个最差查询:

SELECT TOP 10
    total_worker_time/execution_count AS Avg_CPU_Time
        ,execution_count
        ,total_elapsed_time/execution_count as AVG_Run_Time
        ,(SELECT
              SUBSTRING(text,statement_start_offset/2,(CASE
                                                           WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 
                                                           ELSE statement_end_offset 
                                                       END -statement_start_offset)/2
                       ) FROM sys.dm_exec_sql_text(sql_handle)
         ) AS query_text 
FROM sys.dm_exec_query_stats 

--pick your criteria

ORDER BY Avg_CPU_Time DESC
--ORDER BY AVG_Run_Time DESC
--ORDER BY execution_count DESC
于 2010-03-23T12:53:04.687 回答
6

这篇MSDN 杂志文章提供了有关此主题的出色信息。

于 2010-03-23T13:10:47.873 回答
5

如果您想按时间查找性能最差的查询,我会使用这个:

SELECT *
FROM sys.dm_exec_query_stats a
CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd
ORDER BY total_elapsed_time/execution_count DESC

exec_query_stats然而,找到“最差”的查询通常需要对DMV进行更多的探索。有很多事情需要考虑:

  1. 上述查询将产生的按时间计算的最差单个查询。
  2. 最糟糕的 CPU 猪(如果你在 CPU 上运行高)将按total_worker_time/execution_count
  3. 读取次数最多的查询通常是耗时最长的查询。

现在,这些查询将突出显示性能不佳的查询,但通常您可能会遇到性能“一般”但被频繁调用的查询,这会降低应用程序的整体性能。要找到这些,请按total_elapsed时间(或total_[whatever metric you are interested in])对上述查询进行排序,不要除以execution_count

于 2010-03-23T12:57:40.323 回答
3

使用 SQL Profiler 查找执行缓慢的查询

  • 启动 SQL Profiler(最好在实时数据库上)。
  • 文件 -> 新建跟踪
  • 选择 SQL 服务器
  • 标签过滤器
  • 可以选择在数据库名称上设置过滤器
  • 启动分析器 (RUN)
  • 将结果保存在一个表中,例如:_Mytrace,最好是在没有太多工作要做的数据库服务器上
  • 过滤选择查询
  • 按持续时间排序
  • 检查此查询的执行计划
于 2010-03-23T12:51:04.893 回答