加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 如何通过数据库获取特定实例的CPU使用率?

发布时间:2021-01-10 13:23:43 所属栏目:编程 来源:网络整理
导读:我找到了以下查询来检测数据库的CPU行使环境,但它们表现差异的功效: WITH DB_CPU_StatsAS( SELECT DatabaseID,DB_Name(DatabaseID) AS [DatabaseName],SUM(total_worker_time) AS [CPU_Time_Ms] FROM sys.dm_exec_query_stats AS qs CROSS APPLY ( SELECT CO

我找到了以下查询来检测数据库的CPU行使环境,但它们表现差异的功效:

WITH DB_CPU_Stats
AS
(
    SELECT DatabaseID,DB_Name(DatabaseID) AS [DatabaseName],SUM(total_worker_time) AS [CPU_Time_Ms]
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY (
                    SELECT CONVERT(int,value) AS [DatabaseID] 
                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                  WHERE attribute = N'dbid') AS F_DB
    GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],DatabaseName,[CPU_Time_Ms],CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5,2)) AS [CPUPercent]
FROM DB_CPU_Stats
--WHERE DatabaseID > 4 -- system databases
--AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

上面的查询汇报我的题目是我的一个数据库(险些96%).

而且下面的查询汇报题目是主数据库和分发数据库(约莫90%):

DECLARE @total INT
SELECT @total=sum(cpu) FROM sys.sysprocesses sp (NOLOCK)
    join sys.sysdatabases sb (NOLOCK) ON sp.dbid = sb.dbid

SELECT sb.name 'database',@total 'system cpu',SUM(cpu) 'database cpu',CONVERT(DECIMAL(4,1),CONVERT(DECIMAL(17,2),SUM(cpu)) / CONVERT(DECIMAL(17,@total)*100) '%'
FROM sys.sysprocesses sp (NOLOCK)
JOIN sys.sysdatabases sb (NOLOCK) ON sp.dbid = sb.dbid
--WHERE sp.status = 'runnable'
GROUP BY sb.name
ORDER BY CONVERT(DECIMAL(4,@total)*100) desc

我搜查过sys.sysprocesses是否已经理会.这是否意味着第二个查询的功效是错误的?

办理要领

固然我和@Thomas一样,在关于“每个数据库CPU行使率”的题目的评述的评述中完全赞成@Aaron是精确的照旧有效的,但我至少可以答复这个题目为什么这两个题目是云云差异.而且它们差异的缘故起因将表白哪一个更精确,尽量更高的精确度如故相对支付格禁绝确的谁人,因此如故不是真正精确的;-).

第一个查询行使sys.dm_exec_query_stats来获取CPU信息(即total_worker_time).假如您转到该DMV的MSDN文档的链接页面,您将看到一个简短的3句简介,个中2个句子为我们提供相识这个信息配景的大部门内容(“它有多靠得住”和“它怎样与sys.sysprocesses对比”).这两句话是:

Returns aggregate performance statistics for cached query plans in SQL Server. … When a plan is removed from the cache,the corresponding rows are eliminated from this view

第一句“返回聚合机能统计信息”汇报我们,此DMV中的信息(与其他几个一样)是累积的,并不只仅针对当前正在运行的查询.这也是由DMV中的字段指示的,该字段不是题目,execution_count中的查询的一部门,其再次表现这是累积数据.通过将一些指标除以execution_count,可以得到均匀值等,这长短常利便的.

第二句“从缓存中删除的打算也将以后DMV中删除”,表白它基础不是一个完备的图片,出格是假如处事器已经有一个很是完备的打算缓存而且正处于负载状态,因此即将到期打算有点频仍.另外,当处事器重置时,大大都DMV城市重置,因此纵然打算到期时未删除这些行,它们也不是真正的汗青记录.

此刻让我们将上述内容与sys.sysprocesses举办比拟.此体系视图仅表现当前正在运行的内容,就像sys.dm_exec_connections,sys.dm_exec_sessions和sys.dm_exec_requests的组合(在sys.dm_exec_sessions的链接页面上声名).与sys.dm_exec_query_stats DMV对比,这是一个完全差异的处事器视图,纵然在历程完成后也生涯数据.意思是,相对付“第二个查询的功效是错误的吗?”题目,他们没有错,他们只是属于机能统计的差异方面(即时刻框架).

因此,行使sys.sysprocesses的查询只是“当即查察”.而且行使sys.dm_exec_query_stats的查询首要(也许)查察自前次从头启动SQL Server处事(或显然体系重启)以来产生的环境.对付一样平常的机能说明,好像sys.dm_exec_query_stats要好得多,但同样,它会一向扬弃有效的信息.而且,在这两种环境下,您还必要起首思量@Aaron在题目注释(自删除)中关于“database_id”值的精确性所提出的要点(即它仅反应启动代码的勾当数据库),不必然是“题目”产生的处所).

可是,假如您只是必要/想要相识全部数据库中正在产生的工作,也许是由于此刻环境正在放缓,您最好行使sys.dm_exec_connections,sys.dm_exec_sessions和sys的组合. dm_exec_requests(而不是已弃用的sys.sysprocesses).请记着,您正在查察/查询查询,而不是数据库,由于查询可以跨多个数据库毗连,包罗来自一个或多个数据库的UDF等.

编辑:
假如总体题目是镌汰高CPU斲丧者,那么探求占用最多CPU的查询,由于数据库现实上不占用CPU(查察每个数据库也许在托管公司事变,个中每个数据库被断绝并拥有一个差异的客户).

以下查询将辅佐辨认具有高均匀CPU行使率的查询.它会压缩query_stats DMV中的数据,由于这些记录可以多次表现沟通的查询(是的,查询批次的沟通子集),每个都有差异的执行打算.

;WITH cte AS
(
  SELECT stat.[sql_handle],stat.statement_start_offset,stat.statement_end_offset,COUNT(*) AS [NumExecutionPlans],SUM(stat.execution_count) AS [TotalExecutions],((SUM(stat.total_logical_reads) * 1.0) / SUM(stat.execution_count)) AS [AvgLogicalReads],((SUM(stat.total_worker_time) * 1.0) / SUM(stat.execution_count)) AS [AvgCPU]
  FROM sys.dm_exec_query_stats stat
  GROUP BY stat.[sql_handle],stat.statement_end_offset
)
SELECT CONVERT(DECIMAL(15,5),cte.AvgCPU) AS [AvgCPU],CONVERT(DECIMAL(15,cte.AvgLogicalReads) AS [AvgLogicalReads],cte.NumExecutionPlans,cte.TotalExecutions,DB_NAME(txt.[dbid]) AS [DatabaseName],OBJECT_NAME(txt.objectid,txt.[dbid]) AS [ObjectName],SUBSTRING(txt.[text],(cte.statement_start_offset / 2) + 1,(
         (CASE cte.statement_end_offset 
           WHEN -1 THEN DATALENGTH(txt.[text])
           ELSE cte.statement_end_offset
          END - cte.statement_start_offset) / 2
         ) + 1
       )
FROM cte
CROSS APPLY sys.dm_exec_sql_text(cte.[sql_handle]) txt
ORDER BY cte.AvgCPU DESC;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读