代码之家  ›  专栏  ›  技术社区  ›  Thomas Bratt

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

  •  15
  • Thomas Bratt  · 技术社区  · 16 年前

    如何查找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 回复  |  直到 10 年前
        1
  •  25
  •   KM.    16 年前

    基于…的前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
    
        2
  •  6
  •   Ivan Zlatanov    16 年前

    This 《msdn杂志》的文章提供了关于这个主题的极好信息。

        3
  •  4
  •   Roman Marusyk S Kotra    10 年前

    如果您希望按所用时间查找执行情况最差的查询,我将使用以下命令:

    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 二甲基亚砜有很多事情要考虑:

    1. 按时间划分的最差单个查询,上面的查询将生成这些查询。
    2. 最差的CPU占用率(如果您在CPU上运行得很高),这将导致 total_worker_time/execution_count
    3. 读取次数最多的查询,通常是花费时间最长的查询。

    现在,这些查询将突出显示性能较差的查询,但通常情况下,您的查询可能具有“公平”的性能,但被频繁调用会降低应用程序的总体性能。要查找这些,请按 total_elapsed 时间(或 total_[whatever metric you are interested in] )不要被 execution_count .

        4
  •  3
  •   Ivo    16 年前

    使用SQL事件探查器查找执行缓慢的查询

    • 启动SQL事件探查器(最好在实时数据库上)。
    • 文件->新建跟踪
    • 选择SQL Server
    • 选项卡筛选器
    • 可以选择对数据库名称设置筛选器
    • 启动探查器(运行)
    • 将结果保存到一个表中,例如:MyTrace,最好保存在一个数据库服务器上,该服务器上没有太多工作要做。
    • 筛选选择查询
    • 按持续时间排序
    • 检查此查询的执行计划