【问题标题】:SQL Server Consuming Most of the CPU TimeSQL Server 消耗大部分 CPU 时间
【发布时间】:2018-06-06 12:11:50
【问题描述】:

在我的环境中,特定时区的 CPU 利用率很高。当我运行以下查询时,我知道 sql server 某某记录 id 消耗了最多的 CPU 时间。

DECLARE @ms_ticks_now BIGINT
SELECT @ms_ticks_now = ms_ticks
FROM sys.dm_os_sys_info;
SELECT  record_id
       ,dateadd(ms, - 1 * (@ms_ticks_now - [timestamp]), GetDate()) AS EventTime
       ,SQLProcessUtilization
       ,SystemIdle
       ,100 - SystemIdle - SQLProcessUtilization AS OtherProcessUtilization
       ,TIMESTAMP
FROM (
       SELECT record.value('(./Record/@id)[1]', 'int') AS record_id
              ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle
              ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization
              ,TIMESTAMP
       FROM (
              SELECT TIMESTAMP
                     ,convert(XML, record) AS record
              FROM sys.dm_os_ring_buffers
              WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
                     AND record LIKE '%<SystemHealth>%'
              ) AS x
       ) AS y
ORDER BY record_id DESC

使用得到的结果中的RecordID,我们可以得到运行的查询文本。如果可以,请分享查询

谢谢 拉玛拉朱

【问题讨论】:

  • 你所说的特定时区是什么意思,你指的是特定时间
  • 时区不过是应用程序繁忙的营业时间。查询结果时间戳上方...对于运行查询的特定时间戳

标签: sql sql-server sql-server-2008 sql-server-2012 database-administration


【解决方案1】:

我使用下面的查询来查找查询并查看前 100 个 AvgDuration 的计划,或者您可以修改为按 TotalCPU 排序。只要计划缓存没有被刷新,您应该能够找到查询和 last_execution_time。很确定我在 StackOverflow 的某个地方找到了这个查询,但不记得确切的位置。

SELECT TOP 100 
    DB_NAME(st.dbid) as DatabaseName,
    total_worker_time / execution_count AS AvgCPU ,
    total_worker_time AS TotalCPU ,
    (total_elapsed_time / execution_count)/1000000 AS AvgDurationSeconds,
    total_elapsed_time AS TotalDuration ,
    total_elapsed_time / 1000000 as TotalDurationSeconds,
    total_logical_reads / execution_count AS AvgReads ,
    total_logical_reads AS TotalReads ,
    execution_count ,
    qs.creation_time AS plan_creation_time,
    qs.last_execution_time,
        CONVERT(VARCHAR(MAX),REPLACE(REPLACE(REPLACE(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),CHAR(13), ''),CHAR(9),' '),CHAR(10),' ')) AS QueryText,
        query_plan
    FROM sys.dm_exec_query_stats AS qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
        CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
    WHERE DB_NAME(st.dbid) IS NOT NULL
    /* Sorting options - uncomment the one you'd like to use: */
    --ORDER BY TotalReads DESC;
    --ORDER BY TotalCPU DESC;
    ORDER BY AvgDurationSeconds DESC;
    --ORDER BY TotalDuration DESC;
    --ORDER BY execution_count DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2012-11-16
    • 2018-11-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多