暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何查询占用CPU较高的SQL语句

SQL数据库运维 2022-05-19
1529

点击蓝色字关注“SQL数据库运维”

以下SQL语句测试环境在SQL Server 2014企业版数据库版本下进行的测试,自行测试时,可根据实际情况进行自主选择。


查找最占CPU的 top 语句 

收藏 在看 点赞 备用


  • 找出执行时间最长的10条SQL语句(适用于SQL SERVER 2005及其以上版本)(可左右滑动查看完整代码)

    SELECT
    (total_elapsed_time execution_count)/1000 N'平均时间ms'
    ,total_elapsed_time/1000 N'总花费时间ms'
    ,total_worker_time/1000 N'所用的CPU总时间ms'
    ,total_physical_reads N'物理读取总次数'
    ,total_logical_reads/execution_count N'每次逻辑读次数'
    ,total_logical_reads N'逻辑读取总次数'
    ,total_logical_writes N'逻辑写入总次数'
    ,execution_count N'执行次数'
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1
    ,((CASE statement_end_offset
    WHEN -1 THEN DATALENGTH(st.text)
    ELSE qs.statement_end_offset END
    - qs.statement_start_offset)/2) + 1) N'执行语句'
    ,creation_time N'语句编译时间'
    ,last_execution_time N'上次执行时间'
    ,qp.query_plan
    FROM
    sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
    WHERE SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text)ELSE qs.statement_end_offset END- qs.statement_start_offset)/2) + 1)
    not like '%user%'ORDER BY
    total_elapsed_time execution_count DESC;
    备注:如果想对SQL作筛选,可以更换not like ‘%user%’部分,如将not like ‘%user%’ 换成 like '%bq%'就可以找出SQL语句中含有bq关键字的SQL 。

    • 找出平均消耗CPU最多的前5个SQL语句 (SQL SERVER 2005或以上版本)(可左右滑动查看完整代码)

      SELECT TOP 5 total_worker_time / execution_count AS [Avg CPU Time],  
      SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
      ((CASE qs.statement_end_offset
      WHEN -1 THEN DATALENGTH(st.text)
      ELSE qs.statement_end_offset
      END - qs.statement_start_offset)/2) + 1) AS statement_text
      FROM sys.dm_exec_query_stats AS qs
      CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
      ORDER BY total_worker_time/execution_count DESC

      • 平均消耗CPU最多的前20个SQL语句 (SQL SERVER 2008或以上版本)(可左右滑动查看完整代码)

         SELECT TOP 20
        total_worker_time/1000 AS [总消耗CPU 时间(ms)],
        execution_count [运行次数],
        qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
        last_execution_time AS [最后一次执行时间],
        min_worker_time /1000 AS [最小执行时间(ms)],
        max_worker_time /1000 AS [最大执行时间(ms)],
        SUBSTRING(qt.text,qs.statement_start_offset/2+1,
        (CASE WHEN qs.statement_end_offset = -1
        THEN DATALENGTH(qt.text)
        ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
        AS [使用CPU的语法], qt.text [完整语法],
        qt.dbid, dbname=db_name(qt.dbid),
        qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
        FROM sys.dm_exec_query_stats qs WITH(nolock)
        CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
        WHERE execution_count>1
        ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC

        • 总耗CPU最多的前20个SQL (SQL SERVER 2008或以上版本)(可左右滑动查看完整代码)

            SELECT TOP 20
          total_worker_time/1000 AS [总消耗CPU 时间(ms)],
          execution_count [运行次数],
          qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
          last_execution_time AS [最后一次执行时间],
          min_worker_time /1000 AS [最小执行时间(ms)],
          max_worker_time /1000 AS [最大执行时间(ms)],
          SUBSTRING(qt.text,qs.statement_start_offset/2+1,
          (CASE WHEN qs.statement_end_offset = -1
          THEN DATALENGTH(qt.text)
          ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
          AS [使用CPU的语法],
          qt.text [完整语法],
          qt.dbid, dbname=db_name(qt.dbid),
          qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
          FROM sys.dm_exec_query_stats qs WITH(nolock)
          CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
          WHERE execution_count>1
          ORDER BY total_worker_time DESC

          点击关注“SQL数据库运维”,后台或公众号底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。


          动动小手点击加关注呦☟☟☟

          来源:CSDN博客

          作者:夜光小兔纸

          原文:https://blog.csdn.net/Ruishine/article/details/116704603

          文章转载自SQL数据库运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论