用于在重复作业中检索每个数据库的 CPU 和内存统计信息的 SQL 脚本

问题描述 投票:0回答:1

我的要求是得到-

每个命名实例的每个数据库

CPU 使用率(%) 内存使用情况(MB) 已用磁盘空间 MB (GB) 已用 SQL 数据空间总计 (GB)(总计)(GB) 已用 SQL 日志空间总计 (GB) 数据库增长 (MB) 表增长 (MB) 索引大小 已用空间 (MB) 以上的平均 % 或 MB 就很好了

数据库增长预测 MB 磁盘使用预测 (MB) 内存使用预测 (MB) CPU 使用率预测 (%)

以上所有内容均使用脚本创建,存储过程和 SP 存储结果存储表格以供进一步分析

我查看了可用的 PowerShell 脚本,但被要求提出一个基于 SQL 的解决方案,该解决方案可以用作存储过程或计划的代理作业。

sql sql-server database cpu-usage
1个回答
-1
投票

我最近使用了下面的脚本,它包括每个数据库的 CPU 和内存使用情况的一些标准属性,并且可以在需要的地方轻松添加更多属性,我相信这可以进一步提高性能,但它提供了所需的内容,运行它添加要在其上创建输出表的 USE DB:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

if not exists (select * from sysobjects where name='db_log' and xtype='U')
CREATE TABLE [dbo].[db_log](
    [server_name] [nvarchar](128) NULL,
    [created_at] [datetime] NOT NULL,
    [server_cpu_idle] [int] NULL,
    [server_cpu_sql] [int] NULL,
    [db_id] [int] NULL,
    [db_name] [nvarchar](128) NULL,
    [db_buffer_pages] [bigint] NULL,
    [db_buffer_MB] [bigint] NULL,
    [db_buffer_percent] [decimal](6, 3) NULL,
    [db_cputime_as_percentage] [decimal](6, 3) NULL
) ON [PRIMARY]
GO

DECLARE @total_buffer INT;  

SELECT @total_buffer = cntr_value  
FROM sys.dm_os_performance_counters   
WHERE RTRIM([object_name]) LIKE '%Buffer Manager'  
AND counter_name = 'Database Pages';  
  
;WITH src AS  
(  
  SELECT   
  database_id, db_buffer_pages = COUNT_BIG(*)  
  FROM sys.dm_os_buffer_descriptors  
  --WHERE database_id BETWEEN 5 AND 32766     --Uncomment if you only need user databases
  GROUP BY database_id  
)
INSERT INTO dbo.db_log
SELECT 
@@SERVERNAME AS 'server_name',
GETDATE() AS 'created_at',
(SELECT record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [server_cpu_idle]
FROM (
         SELECT TOP 1 CONVERT(XML, record) AS record
         FROM sys.dm_os_ring_buffers
         WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
         AND record LIKE '% %'
         ORDER BY TIMESTAMP DESC
) as cpu_usage),
(SELECT record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [server_cpu_sql]
FROM (
         SELECT TOP 1 CONVERT(XML, record) AS record
         FROM sys.dm_os_ring_buffers
         WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
         AND record LIKE '% %'
         ORDER BY TIMESTAMP DESC
) as cpu_usage),
[db_id] = [database_id],
[db_name] = CASE [database_id] WHEN 32767   
THEN 'Resource DB'   
ELSE DB_NAME([database_id]) END,  
db_buffer_pages,  
db_buffer_MB = db_buffer_pages / 128,  
db_buffer_percent = CONVERT(DECIMAL(6,3),   
db_buffer_pages * 100.0 / @total_buffer),
(SELECT T.[CPUTimeAsPercentage]
   FROM
    (SELECT 
        [Database],
        CONVERT (DECIMAL (6, 3), [CPUTimeInMiliSeconds] * 1.0 / 
        SUM ([CPUTimeInMiliSeconds]) OVER () * 100.0) AS [CPUTimeAsPercentage]
     FROM 
      (SELECT 
          dm_execplanattr.DatabaseID,
          DB_Name(dm_execplanattr.DatabaseID) AS [Database],
          SUM (dm_execquerystats.total_worker_time) AS CPUTimeInMiliSeconds
       FROM sys.dm_exec_query_stats dm_execquerystats
       CROSS APPLY 
        (SELECT 
            CONVERT (INT, value) AS [DatabaseID]
         FROM sys.dm_exec_plan_attributes(dm_execquerystats.plan_handle)
         WHERE attribute = N'dbid'
        ) dm_execplanattr
       GROUP BY dm_execplanattr.DatabaseID
      ) AS CPUPerDb
    )  AS T
   WHERE T.[Database] = DB_NAME([database_id])) AS db_cputime_as_percentage
--INTO db_log
FROM src  
ORDER BY db_buffer_MB DESC;
© www.soinside.com 2019 - 2024. All rights reserved.