SQL Server 2008: How to query all databases sizes?

后端 未结 15 982
伪装坚强ぢ
伪装坚强ぢ 2021-01-29 18:08

I have MS SQL 2008 R2, 500 databases. What is the most efficient, easiest and \'modern\' way to query all databases sizes.

The output should have columns:

15条回答
  •  猫巷女王i
    2021-01-29 18:44

    I don't know exactly what you mean by efficiency but this is straightforward and it works for me:

    SELECT
        DB_NAME(db.database_id) DatabaseName,
        (CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB,
        (CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB,
        (CAST(mfstream.StreamSize AS FLOAT)*8)/1024 StreamSizeMB,
        (CAST(mftext.TextIndexSize AS FLOAT)*8)/1024 TextIndexSizeMB
    FROM sys.databases db
        LEFT JOIN (SELECT database_id, SUM(size) RowSize FROM sys.master_files WHERE type = 0 GROUP BY database_id, type) mfrows ON mfrows.database_id = db.database_id
        LEFT JOIN (SELECT database_id, SUM(size) LogSize FROM sys.master_files WHERE type = 1 GROUP BY database_id, type) mflog ON mflog.database_id = db.database_id
        LEFT JOIN (SELECT database_id, SUM(size) StreamSize FROM sys.master_files WHERE type = 2 GROUP BY database_id, type) mfstream ON mfstream.database_id = db.database_id
        LEFT JOIN (SELECT database_id, SUM(size) TextIndexSize FROM sys.master_files WHERE type = 4 GROUP BY database_id, type) mftext ON mftext.database_id = db.database_id
    

    With results like:

    DatabaseName  RowSizeMB LogSizeMB StreamSizeMB TextIndexSizeMB
    ------------- --------- --------- ------------ ---------------
    master        4         1.25      NULL         NULL
    model         2.25      0.75      NULL         NULL
    msdb          14.75     8.1875    NULL         NULL
    tempdb        8         0.5       NULL         NULL
    

    Note: was inspired by this article

提交回复
热议问题