我的要求是得到-
每个命名实例的每个数据库
CPU 使用率(%) 内存使用情况(MB) 已用磁盘空间 MB (GB) 已用 SQL 数据空间总计 (GB)(总计)(GB) 已用 SQL 日志空间总计 (GB) 数据库增长 (MB) 表增长 (MB) 索引大小 已用空间 (MB) 以上的平均 % 或 MB 就很好了
数据库增长预测 MB 磁盘使用预测 (MB) 内存使用预测 (MB) CPU 使用率预测 (%)
以上所有内容均使用脚本创建,存储过程和 SP 存储结果存储表格以供进一步分析
我查看了可用的 PowerShell 脚本,但被要求提出一个基于 SQL 的解决方案,该解决方案可以用作存储过程或计划的代理作业。
我最近使用了下面的脚本,它包括每个数据库的 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;