sql >> データベース >  >> RDS >> Sqlserver

SQLServerで1つのデータベースのアクティビティを分析する方法

    多くのプロジェクトで1つのSQLServerインスタンスを使用することは珍しいことではありません。ただし、最もアクティブなプロジェクトを定義することは非常に難しい場合があります。今日は、特定の各データベースのアクティビティを分析するためのいくつかの方法を共有したいと思います。

    この記事では、次の点について検討します。

    1. データベース接続の数
    2. ディスク容量
    3. RAM容量
    4. 特定の期間におけるデータベースファイルのアクティビティ

    データベース接続の数

    接続数を定義するには、 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つのインスタンスと多くのプロジェクト内のすべてを表示して実装することはできないため、別のインスタンスに配置することを強くお勧めします。


    1. SQL Server(T-SQL)で照合を見つける方法

    2. Ubuntu18.04にAzureDataStudioをインストールします

    3. Oracle SQL Developerを使用してテーブルをCSVにエクスポートする方法は?

    4. SYSDATE()の例– MySQL