多くのプロジェクトで1つのSQLServerインスタンスを使用することは珍しいことではありません。ただし、最もアクティブなプロジェクトを定義することは非常に難しい場合があります。今日は、特定の各データベースのアクティビティを分析するためのいくつかの方法を共有したいと思います。
この記事では、次の点について検討します。
- データベース接続の数
- ディスク容量
- RAM容量
- 特定の期間におけるデータベースファイルのアクティビティ
データベース接続の数
接続数を定義するには、 master.dbo.sysprocessesを使用します
SELECT DB_NAME(p.dbid) db, COUNT(*) quantity FROM master.dbo.sysprocesses p WHERE p.spid > 50 group by DB_NAME(p.dbid) ORDER BY 1
接続数には、データベースのアクティビティと負荷は表示されないことに注意してください。接続はアイドルまたはアクティブのいずれかになります。
ディスクスペース
CREATE TABLE #sizingDB (dbname nvarchar(255), type_desc nvarchar(50), size_mb bigint) INSERT INTO #sizingDB exec sp_msforeachdb @command1 = 'use [?]; SELECT DB_NAME(),type_desc, SUM(size)*8/1024 as size FROM sys.database_files GROUP BY type_desc' SELECT * FROM #sizingDB WHERE dbname NOT IN ('master','msdb','model') ORDER BY dbname, type_desc DESC DROP TABLE #sizingDB
クエリは、データベースごとに2つの行を返します。最初の行はデータサイズで、2番目の行はトランザクションログです。
データファイルとログの合計は、データベースごとに1行のみを返します。
select db_name(dbid), sum(cast(size as bigint)) * 8 / 1024 as SizeGB, sum(case when f.groupid = 0 then 0 else cast(size as bigint) end) * 8 / 1024 as DataSizeMb, sum(case when f.groupid != 0 then 0 else cast(size as bigint) end) * 8 / 1024 as LogSizeMb from master.sys.sysaltfiles as f group by db_name(dbid) order by SizeGB desc
RAM容量
WITH AggregateBufferPoolUsage AS (SELECT DB_NAME(database_id) AS [Database Name], CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2)) AS [CachedSize] FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) WHERE database_id > 4 -- system databases AND database_id <> 32767 -- ResourceDB GROUP BY DB_NAME(database_id)) SELECT ROW_NUMBER() OVER(ORDER BY CachedSize DESC) AS [Buffer Pool Rank], [Database Name], CachedSize AS [Cached Size (MB)], CAST(CachedSize / SUM(CachedSize) OVER() * 100.0 AS DECIMAL(5,2)) AS [Buffer Pool Percent] FROM AggregateBufferPoolUsage ORDER BY [Buffer Pool Rank];
[バッファプールの割合]列には、総容量に対するメモリ消費の割合が反映されます。
特定の期間におけるデータベースファイルのアクティビティ
SELECT DB_NAME(saf.dbid) AS [db], saf.name AS [name], vfs.BytesRead/1048576 AS [read], vfs.BytesWritten/1048576 AS [write] INTO #dbusage FROM master..sysaltfiles AS saf JOIN ::fn_virtualfilestats(NULL,NULL) AS vfs ON vfs.dbid = saf.dbid AND vfs.fileid = saf.fileid AND saf.dbid NOT IN (1,3,4) WHERE DB_NAME(saf.dbid) <> 'tempdb' ORDER BY vfs.BytesRead/1048576 + BytesWritten/1048576 DESC WAITFOR DELAY '00:01:00' SELECT DB_NAME(saf.dbid) AS [db], saf.name AS [name], vfs.BytesRead/1048576 AS [read], vfs.BytesWritten/1048576 AS [write] INTO #dbusage2 FROM master..sysaltfiles AS saf JOIN ::fn_virtualfilestats(NULL,NULL) AS vfs ON vfs.dbid = saf.dbid AND vfs.fileid = saf.fileid AND saf.dbid NOT IN (1,3,4) WHERE DB_NAME(saf.dbid) <> 'tempdb' ORDER BY vfs.BytesRead/1048576 + BytesWritten/1048576 DESC SELECT t.db,t.name,(t2.[read] - t.[read]) as tread,(t2.[write] - t.[write]) as [twrite] FROM #dbusage t INNER JOIN #dbusage2 t2 on t.db= t2.db AND t.name=t2.name DROP TABLE #dbusage DROP TABLE #dbusage2
スクリプトは、デフォルトで1分あたりの情報を収集します。長期間のレポートが必要な場合は、 WAITFOR DELAY ’00:01:00’を変更してください。
レポートは、各データベースファイルの情報を返します。
結論
1つのSQLServerインスタンスに多数のプロジェクトがある場合でも、それぞれについて十分な情報を取得できます。もちろん、プロジェクトが重要であり、アクセスするために特別な条件が必要な場合は、1つのインスタンスと多くのプロジェクト内のすべてを表示して実装することはできないため、別のインスタンスに配置することを強くお勧めします。