web-dev-qa-db-ja.com

データベースの増加を計算するクエリ

データベーススペースの使用状況に関するMDWデータコレクターからいくつかの優れた情報を出力する次のクエリがあります。次の列(データベースサイズ、予約済みスペース、未使用スペース、未割り当てスペース、収集日)でデータベースの増加傾向を適切に計算するにはどうすればよいですか?私はデータベースが縮小するか成長するかを考慮に入れようとしているので、単に「最大サイズ」を取得してそこから進むことはできません。これまでの完全なクエリは次のとおりです...

DECLARE @ServerName VARCHAR(MAX);
DECLARE @SelectedDatabaseName VARCHAR(MAX);
DECLARE @snapshot_id INT;

SELECT TOP 1
        @snapshot_id = snapshot_id
FROM    ( SELECT DISTINCT TOP 100
                    d.snapshot_id
          FROM      snapshots.disk_usage d ,
                    core.snapshots ss
--WHERE ss.instance_name = @ServerName
--AND ss.snapshot_id = d.snapshot_id
ORDER BY            d.snapshot_id DESC
        ) AS q
ORDER BY snapshot_id ASC;

SELECT  database_name ,
        ss.instance_name ,
        CONVERT (DATETIME, SWITCHOFFSET(CAST (d.collection_time AS DATETIMEOFFSET),
                                        '+00:00')) AS collection_time ,
        d.snapshot_id ,
        ( ( CONVERT(DEC(15, 2), d.dbsize) + CONVERT(DEC(15, 2), d.logsize) )
          * 8192 / 1048576.0 ) AS 'database_size_mb' ,
        'reserved_mb' = ( d.reservedpages * 8192 / 1048576.0 ) ,
        'data_mb' = CONVERT(DEC(15, 2), d.pages) * 8192 / 1048576.0 ,
        'index_mb' = ( d.usedpages - d.pages ) * 8192 / 1048576.0 ,
        'unused_mb' = ( ( CONVERT(DEC(15, 2), d.reservedpages)
                          - CONVERT(DEC(15, 2), d.usedpages) ) * 8192
                        / 1048576.0 ) ,
        'unallocated_space_mb' = ( CASE WHEN d.dbsize >= d.reservedpages
                                        THEN ( CONVERT (DEC(15, 2), d.dbsize)
                                               - CONVERT (DEC(15, 2), d.reservedpages) )
                                             * 8192 / 1048576.0
                                        ELSE 0
                                   END )
FROM    snapshots.disk_usage d ,
        core.snapshots ss
WHERE   --database_name =@SelectedDatabaseName
/*AND*/ d.snapshot_id >= @snapshot_id
--AND ss.instance_name = @ServerName
        AND d.snapshot_id = ss.snapshot_id
ORDER BY d.database_name ASC ,
        collection_time;

うまくいけば、それが終わると、今後1年で、すべてのインスタンス、データベース、およびサーバーが年間どれだけ成長するかを確認できるようになります。

4
choloboy7

方法1:費用がかかります

データの収集とデータベースの成長に関するレポートの提示に関してすべてを実行し、説明されているように収集されたデータに応じて同じことを予測するサードパーティのソフトウェアを使用できます here

方法2:テーブルを作成し、SQLエージェントジョブを使用してストアドプロシージャを実行し、作成されたテーブルのデータを収集して一定期間クエリするようにスケジュールされます何が収集されたかを確認し、便利な計算で予測できます。

説明されているようにこれを使用できます ここ

方法3:手動側ではもう少しですが、うまく機能します。デフォルトのトレースを使用しています。デフォルトトレースを使用して、データの増加イベントをキャプチャし、そのデータベースのログを記録します。これは、デフォルトトレースファイルがそこに留まってロールオーバーされない頻度または長さに応じて異なります。

方法4私の個人的なお気に入りと私が使用してきたもの:

Chad Millerによるこの優れた記事 データベース容量計画 は、T-SQLとPowershellをSSRSレポートと共に使用して、一定の期間にわたる望ましいデータベースの成長を提供します。

5
KASQLDBA

私はこのトピックを扱っている記事を読んだだけで、あなたは興味があると思います:

SQL Serverデータベースの成長率を特定 by Marios Philippopoulos

作成者は、LAGウィンドウ関数を使用して次のスクリプトを作成しました。

SELECT DISTINCT
    A.[database_name]
,   AVG( A.[Backup Size (MB)] - A.[Previous Backup Size (MB)] ) OVER ( PARTITION BY A.[database_name] ) AS [Avg Size Diff From Previous (MB)]
,   MAX( A.[Backup Size (MB)] - A.[Previous Backup Size (MB)] ) OVER ( PARTITION BY A.[database_name] ) AS [Max Size Diff From Previous (MB)]
,   MIN( A.[Backup Size (MB)] - A.[Previous Backup Size (MB)] ) OVER ( PARTITION BY A.[database_name] ) AS [Min Size Diff From Previous (MB)]
,   A.[Sample Size]
FROM 
(
    SELECT
        s.[database_name]
    --, s.[backup_start_date]
    ,   COUNT(*) OVER ( PARTITION BY s.[database_name] ) AS [Sample Size]
    ,   CAST ( ( s.[backup_size] / 1024 / 1024 ) AS INT ) AS [Backup Size (MB)]
    ,   CAST ( ( LAG(s.[backup_size] ) 
            OVER ( PARTITION BY s.[database_name] ORDER BY s.[backup_start_date] ) / 1024 / 1024 ) AS INT ) AS [Previous Backup Size (MB)]
    FROM 
        [msdb]..[backupset] s
    WHERE
        s.[type] = 'D' --full backup
    --ORDER BY
    --  s.[database_name]
    --, s.[backup_start_date]
) AS A
ORDER BY
    [Avg Size Diff From Previous (MB)] DESC;
1
Magier