gpt4 book ai didi

sql-server - 数据库的CPU利用率?

转载 作者:行者123 更新时间:2023-12-01 19:23:31 32 4
gpt4 key购买 nike

是否可以按数据库获取 CPU 利用率的详细信息?

理想情况下,我正在寻找 SQL Server 的任务管理器类型接口(interface),但我不想查看每个 PID(如 taskmgr )或每个 SPID(如 spwho2k5 )的 CPU 利用率,而是想查看每个数据库的总 CPU 利用率。假设有一个 SQL 实例。

我意识到可以编写工具来收集这些数据并报告它,但我想知道是否有任何工具可以让我实时查看哪些数据库对 sqlservr.exe 贡献最大CPU负载。

最佳答案

有点。检查这个查询:

SELECT total_worker_time/execution_count AS AvgCPU  
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration
, total_elapsed_time AS TotalDuration
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count
, 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 txt
, 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
ORDER BY 1 DESC

这将为您提供计划缓存中的查询,按照它们使用了多少 CPU 的顺序排列。您可以定期运行它,就像在 SQL 代理作业中一样,并将结果插入到表中,以确保数据在重新启动后仍然存在。

当您阅读结果时,您可能会意识到为什么我们不能将该数据直接关联回单个数据库。首先,单个查询还可以通过执行以下技巧来隐藏其真正的数据库父级:

USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute

查询将在 MSDB 中执行,但会从 AdventureWorks 轮询结果。我们应该在哪里分配CPU消耗?

当您执行以下操作时,情况会变得更糟:

  • 多个数据库之间的连接
  • 在多个数据库中运行事务,并且锁定工作跨越多个数据库
  • 在 MSDB 中运行在 MSDB 中“工作”的 SQL 代理作业,但备份单个数据库

事情一直在继续。这就是为什么在查询级别而不是数据库级别进行性能调整更有意义。

在 SQL Server 2008R2 中,Microsoft 引入了性能管理和应用程序管理功能,使我们能够将单个数据库打包在可分发和可部署的 DAC 包中,并且它们有望提供使管理单个数据库及其性能变得更容易的功能。应用程序。但它仍然不能满足您的要求。

有关更多信息,请查看T-SQL repository at Toad World's SQL Server wiki (formerly at SQLServerPedia) .

于 1/29 更新,包含总数而不仅仅是平均值。

关于sql-server - 数据库的CPU利用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28952/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com