SQL Server 2008:如何查询所有数据库大小?

我有MS SQL 2008 R2,500个数据库。 什么是查询所有数据库大小的最有效,最简单和“现代”的方式。

输出应该有列:

  • 数据库名称
  • DataFilesSize
  • LogFilesSize
with fs as ( 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) LogFileSizeMB from sys.databases db 

我不确切地知道你的意思是什么,但这是直接的,它适用于我:

 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 

结果如下:

 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 

注:受此文启发

这是一个简单,快速和可靠的查询,它将为所有数据库和日志文件名称,大小以及数据库状态(例如ONLINE)提供一个很好的,易读的输出:

 SELECT D.name, F.Name AS FileType, F.physical_name AS PhysicalFile, F.state_desc AS OnlineStatus, CAST((F.size*8)/1024 AS VARCHAR(26)) + ' MB' AS FileSize, CAST(F.size*8 AS VARCHAR(32)) + ' Bytes' as SizeInBytes FROM sys.master_files F INNER JOIN sys.databases D ON D.database_id = F.database_id ORDER BY D.name 

总数据库大小按顺序排列

 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 

我最近遇到这个页面寻找这样的事情。 以防万一有人遇到这种情况,只对核心用户数据库感兴趣,你可以使用这样的东西排除Master,msdb …

 SELECT DB_NAME(db.database_id) DatabaseName, (CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB, (CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB 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 where DB_NAME(db.database_id) not like 'master' and DB_NAME(db.database_id) not like 'msdb' and DB_NAME(db.database_id) not like 'model' and DB_NAME(db.database_id) not like 'tempdb' and DB_NAME(db.database_id) not like 'Northwind' and DB_NAME(db.database_id) not like 'ReportServer' order by DB_NAME(db.database_id) 

一切似乎过于复杂! 还是我错过了什么?

当然,你需要的东西是这样的:

 select d.name, case when m.type = 0 then 'Data' else 'Log' end, m.size * 8 / 1024 from sys.master_files m JOIN sys.databases d ON d.database_id = m.database_id 

或者如果你不想要日志:

 select d.name, m.size * 8 / 1024 from sys.master_files m JOIN sys.databases d ON d.database_id = m.database_id and m.type =0 
 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 

请点击下面的链接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 
 IF OBJECT_ID('tempdb.dbo.#space') IS NOT NULL DROP TABLE #space CREATE TABLE #space ( database_id INT PRIMARY KEY , data_used_size DECIMAL(18,2) , log_used_size DECIMAL(18,2) ) DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = STUFF(( SELECT ' USE [' + d.name + '] INSERT INTO #space (database_id, data_used_size, log_used_size) SELECT DB_ID() , SUM(CASE WHEN [type] = 0 THEN space_used END) , SUM(CASE WHEN [type] = 1 THEN space_used END) FROM ( SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024) FROM sys.database_files s GROUP BY s.[type] ) t;' FROM sys.databases d WHERE d.[state] = 0 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') EXEC sys.sp_executesql @SQL SELECT d.database_id , d.name , d.state_desc , d.recovery_model_desc , t.total_size , t.data_size , s.data_used_size , t.log_size , s.log_used_size FROM ( SELECT database_id , log_size = CAST(SUM(CASE WHEN [type] = 1 THEN size END) * 8. / 1024 AS DECIMAL(18,2)) , data_size = CAST(SUM(CASE WHEN [type] = 0 THEN size END) * 8. / 1024 AS DECIMAL(18,2)) , total_size = CAST(SUM(size) * 8. / 1024 AS DECIMAL(18,2)) FROM sys.master_files GROUP BY database_id ) t JOIN sys.databases d ON d.database_id = t.database_id LEFT JOIN #space s ON d.database_id = s.database_id ORDER BY t.total_size DESC 

有时SECURITY的问题阻止要求所有的数据库,你需要与数据库前缀一个接一个地查询,对于这些情况下,我创build了这个dynamic查询

 go declare @Results table ([Name] nvarchar(max), [DataFileSizeMB] int, [LogFileSizeMB] int); declare @QaQuery nvarchar(max) declare @name nvarchar(max) declare MY_CURSOR cursor local static read_only forward_only for select name from master.dbo.sysdatabases where name not in ('master', 'tempdb', 'model', 'msdb', 'rdsadmin'); open MY_CURSOR fetch next from MY_CURSOR into @name while @@FETCH_STATUS = 0 begin if(len(@name)>0) begin print @name + ' Column Exist' set @QaQuery = N'select '''+@name+''' as Name ,sum(case when type = 0 then size else 0 end) as DataFileSizeMB ,sum(case when type = 1 then size else 0 end) as LogFileSizeMB from ['+@name+'].sys.database_files group by replace(name, ''_log'', '''')'; insert @Results exec sp_executesql @QaQuery; end fetch next from MY_CURSOR into @name end close MY_CURSOR deallocate MY_CURSOR select * from @Results order by DataFileSizeMB desc go