SQL Server 2008: How to query all databases sizes?

后端 未结 15 951
伪装坚强ぢ
伪装坚强ぢ 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条回答
  • 2021-01-29 18:42

    with Total Database size ordered Desc

    SELECT     
    DB_NAME(db.database_id) DatabaseName,     
    (CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB,     
    (CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB, 
    (CAST(mfrows.RowSize AS FLOAT)*8)/1024/1024+(CAST(mflog.LogSize AS FLOAT)*8)/1024/1024 DBSizeG,
    (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 
           ORDER BY 4 DESC
    
    0 讨论(0)
  • 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

    0 讨论(0)
  • 2021-01-29 18:46

    please find more deatils or download the script from below link https://gallery.technet.microsoft.com/SIZE-OF-ALL-DATABASES-IN-0337f6d5#content

     DECLARE @spacetable table
     (
     database_name varchar(50) ,
     total_size_data int,
     space_util_data int,
     space_data_left int,
     percent_fill_data float,
     total_size_data_log int,
     space_util_log int,
     space_log_left int,
     percent_fill_log char(50),
     [total db size] int,
     [total size used] int,
     [total size left] int
     )
     insert into  @spacetable
     EXECUTE master.sys.sp_MSforeachdb 'USE [?];
     select x.[DATABASE NAME],x.[total size data],x.[space util],x.[total size data]-x.[space util] [space left data],
     x.[percent fill],y.[total size log],y.[space util],
     y.[total size log]-y.[space util] [space left log],y.[percent fill],
     y.[total size log]+x.[total size data] ''total db size''
     ,x.[space util]+y.[space util] ''total size used'',
     (y.[total size log]+x.[total size data])-(y.[space util]+x.[space util]) ''total size left''
      from (select DB_NAME() ''DATABASE NAME'',
     sum(size*8/1024) ''total size data'',sum(FILEPROPERTY(name,''SpaceUsed'')*8/1024) ''space util''
     ,case when sum(size*8/1024)=0 then ''less than 1% used'' else
     substring(cast((sum(FILEPROPERTY(name,''SpaceUsed''))*1.0*100/sum(size)) as CHAR(50)),1,6) end ''percent fill''
     from sys.master_files where database_id=DB_ID(DB_NAME())  and  type=0
     group by type_desc  ) as x ,
     (select 
     sum(size*8/1024) ''total size log'',sum(FILEPROPERTY(name,''SpaceUsed'')*8/1024) ''space util''
     ,case when sum(size*8/1024)=0 then ''less than 1% used'' else
     substring(cast((sum(FILEPROPERTY(name,''SpaceUsed''))*1.0*100/sum(size)) as CHAR(50)),1,6) end ''percent fill''
     from sys.master_files where database_id=DB_ID(DB_NAME())  and  type=1
     group by type_desc  )y'
     select * from @spacetable
     order by database_name
    
    0 讨论(0)
  • 2021-01-29 18:46

    Simplified & Improved version:

    SELECT
        D.name,
        CAST(SUM(F.size) AS bigint) * 8*1024 AS SizeInBytes,
        CAST(SUM(F.size*8.0)/1024/1024 AS decimal(18,3)) AS SizeInGB
    FROM 
        sys.master_files F
        INNER JOIN sys.databases D ON D.database_id = F.database_id
    GROUP BY D.name
    ORDER BY SizeInBytes desc
    
    0 讨论(0)
  • 2021-01-29 18:47
    SELECT
        DB.name,
        SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB,
        SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB
    FROM
        sys.master_files MF
        JOIN sys.databases DB ON DB.database_id = MF.database_id
    GROUP BY DB.name
    ORDER BY DataFileSizeMB DESC
    
    0 讨论(0)
  • 2021-01-29 18:48

    All this examples work fine on most of my database servers. However if you have 1 server with multiple instances and all those servers those query's give you no result.

    For instance the first query gives a result like:

    name    DataFileSizeMB  LogFileSizeMB
    master  NULL    NULL
    tempdb  NULL    NULL
    model   NULL    NULL
    msdb    NULL    NULL
    

    So the databases are selected from sys.databases, however the table sys.master_files seems to be empty or gives no result.

    Even a simple query as select * from sys.master_files has a result of 0 records. You don't receive any errors but no records are found. On my servers with only 1 database instance this works fine.

    0 讨论(0)
提交回复
热议问题