确定 SQLServer 数据库大小

SQLServer2005/2008Express 版对每个数据库的限制是4GB。据我所知,数据库引擎只考虑数据,因此不包括日志文件、未使用的空间和索引大小。

根据 SQLServer 的限制,获取 MDF 文件的长度不应该给出正确的数据库大小。我的问题是如何得到数据库大小?

119512 次浏览

Sp _ spaceused

在 SQLManagementStudio 中,右键单击数据库并从上下文菜单中选择“属性”。

根据 SQL2000帮助,sp _ spaceused 包括数据和索引。

这个脚本应该是这样的:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18),
data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))


EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?'''
-- SELECT * FROM #t ORDER BY name
-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY name
SELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM #t
DROP TABLE #t

Sp _ help db

不需要循环,不像 sp _ spaceused。

最好的解决方案可能是使用 sys.sysfiles 视图计算每个数据库文件的大小,考虑到每个页面的大小为8 KB,如下所示:

USE [myDatabase]
GO


SELECT
[size] * 8
, [filename]
FROM sysfiles

[ field ]列表示文件的大小,单位为页(对 sysfiles 的引用)。

您将看到至少有两个文件(MDF 和 LDF) : 这些文件的总和将给出整个数据库的正确大小..。

你也可以用这个老式的。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


DECLARE @iCount int, @iMax int, @DatabaseName varchar(200), @SQL varchar (8000)


Select NAME, DBID, crdate, filename, version
INTO #TEMP
from MAster..SYSDatabASES


SELECT @iCount = Count(DBID) FROM #TEMP


Select @SQL='Create Table ##iFile1 ( DBName varchar( 200) NULL, Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT ,
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null ) '+ char(10)
exec (@SQL)




Create Table ##iTotals ( ServerName varchar(100), DBName varchar( 200) NULL, FileType varchar(10),Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT ,
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null )




WHILE @iCount>0
BEGIN
SELECT @iMax =Max(dbid) FROM #TEMP
Select @DatabaseName = Name FROM #TEMP where dbid =@iMax


SELECT @SQL = 'INSERT INTO ##iFile1(Fileid , FileGroup , TotalExtents  , USedExtents  , Name , vFile)
EXEC (''USE [' + @DatabaseName +  '] DBCC showfilestats'')    ' + char(10)


Print  (@SQL)
EXEC (@SQL)




SELECT @SQL = 'UPDATE ##iFile1 SET DBName ='''+ @DatabaseName +''' WHERE DBName IS NULL'
EXEC  (@SQL)




DELETE FROM #TEMP WHERE dbid =@iMax
Select @iCount =@iCount -1
END
UPDATE ##iFile1
SET AllocatedSpace = (TotalExtents * 64.0 / 1024.0 ), UsedSpace =(USedExtents * 64.0 / 1024.0 )


UPDATE ##iFile1
SET PercentageFree = 100-Convert(float,UsedSpace)/Convert(float,AllocatedSpace   )* 100
WHERE USEDSPACE>0


CREATE TABLE #logspace (
DBName varchar( 100),
LogSize float,
PrcntUsed float,
status int
)
INSERT INTO #logspace
EXEC ('DBCC sqlperf( logspace)')






INSERT INTO ##iTotals(ServerName, DBName, FileType,Name, vFile,PercentageFree,AllocatedSpace)
select @@ServerName ,DBNAME,  'Data' as FileType,Name, vFile, PercentageFree  , AllocatedSpace
from ##iFile1
UNION
select @@ServerName ,DBNAME, 'Log' as FileType ,DBName,'' as vFile ,PrcntUsed  , LogSize
from #logspace


Select * from ##iTotals


select ServerName ,DBNAME,  FileType, Sum( AllocatedSpace) as AllocatedSpaceMB
from ##iTotals
Group By  ServerName ,DBNAME, FileType
Order By  ServerName ,DBNAME, FileType




select ServerName ,DBNAME,  Sum( AllocatedSpace) as AllocatedSpaceMB
from ##iTotals
Group By  ServerName ,DBNAME
Order By  ServerName ,DBNAME






drop table ##iFile1
drop table #logspace
drop table #TEMP
drop table ##iTotals

我总是喜欢直接追求它:

SELECT
DB_NAME( dbid ) AS DatabaseName,
CAST( ( SUM( size ) * 8 ) / ( 1024.0 * 1024.0 ) AS decimal( 10, 2 ) ) AS DbSizeGb
FROM
sys.sysaltfiles
GROUP BY
DB_NAME( dbid )

检查 SQLServer 中同时支持 Azure 和 On-Premise-的数据库大小的公共查询

方法1-使用‘ sys.database _ files’系统视图

SELECT
DB_NAME() AS [database_name],
CONCAT(CAST(SUM(
CAST( (size * 8.0/1024) AS DECIMAL(15,2) )
) AS VARCHAR(20)),' MB') AS [database_size]
FROM sys.database_files;

方法2-使用“ sp _ space used”系统存储过程

EXEC sp_spaceused ;