SQL Server 2008: How to query all databases sizes? SQL Server 2008: How to query all databases sizes? sql sql

SQL Server 2008: How to query all databases sizes?


with fsas(    select database_id, type, size * 8.0 / 1024 size    from sys.master_files)select     name,    (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeMB,    (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeMBfrom sys.databases db


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 TextIndexSizeMBFROM 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         NULLmodel         2.25      0.75      NULL         NULLmsdb          14.75     8.1875    NULL         NULLtempdb        8         0.5       NULL         NULL

Note: was inspired by this article


Here's a simple, quick and reliable query that will give all database and log file names, sizes and also database statuses (e.g. ONLINE) in a nice, easy to read output:

SELECT    D.name,    F.Name AS FileType,    F.physical_name AS PhysicalFile,    F.state_desc AS OnlineStatus,    CAST(F.size AS bigint) * 8*1024 AS SizeInBytes,    CAST((F.size*8.0)/1024/1024 AS decimal(18,3)) AS SizeInGBFROM     sys.master_files F    INNER JOIN sys.databases D ON D.database_id = F.database_idORDER BY SizeInBytes desc