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

Tho*_*att 15 sql t-sql sql-server performance sql-server-2008-express

如何在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
Run Code Online (Sandbox Code Playgroud)

取自:

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

KM.*_*KM. 25

基于...的前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
Run Code Online (Sandbox Code Playgroud)

  • 行中的重复项很可能是已经失效的旧版本的查询计划(各种原因,统计信息更改是常见的)计划不会在失效时从内存中弹出,因此它们会显示出来.另一个原因是参数化(或者说缺乏参数化),这意味着许多具有不同参数的类似查询可以在缓存中,使用ad-hoc SQL而不是存储过程,但是当它不是时,看起来像很多重复. (2认同)

Iva*_*nov 6

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


Mat*_*ock 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 上述查询将产生的时间最差的单个查询。
  2. 最糟糕的 CPU 猪(如果您在 CPU 上运行很高),它将按以下顺序排序 total_worker_time/execution_count
  3. 读取次数最多的查询通常是耗时最长的查询。

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