--> Title : 数据库可用空间的计算
--> Author : wufeng4552
--> Date : 2011-01-12
数据库管理员的一个职能就是留意数据库和数据库文件内的空闲空间。自动增长功能作为最后一种手段是很好的,但是主动管理数据库文件是一种更好的方法。如果在文件中有很多的空闲空间,那么这些信息也可以在需要时用来压缩文件。
这里有几点需要提示:
(1):随着数据库的不断填充,它的空间也在不断的增长。
(2):数据库自动增长时,不会需要多少增多少,一般情况会留出额外的空间
(3):如果数据被删除了,则不会自动将空间释放,占用的空间也会一直保留在数据文件中
有几种方法可以查询可用空间
方法一:
use db_sunrise
go
sp_spaceused
/*
database_name database_size unallocated space
---------------------------------------------------------
db_Sunrise 1410.50 MB 376.93 MB
reserved data index_size unused
------------------ ------------------ ------------------
986120 KB 740096 KB 236216 KB 9808 KB
*/
go
sp_spaceused @updateusage = 'TRUE '
sp_spaceused @updateusage = 'TRUE '
/*
database_name database_size unallocated space
---------------------------------------------------
db_Sunrise 1410.50 MB 377.05 MB
reserved data index_size unused
------------------ ------------------ ------------------
986056 KB 740096 KB 236024 KB 9936 KB
*/方法二:
DBCC SQLPERF
这个命令会为你提供每个数据库中日志文件的输出结果。这个命令也会为你提供累计信息,因此如果你有多个日志文件,那么它会提供给你每个数据库所有日志文件的总空闲空间。
DBCC SQLPERF(logspace)
/*
Database Name Log Size (MB) Log Space Used (%) Status
------------------------------------------------------
db_Sunrise 70.55469 96.74316 0
db_Kcgl 1030.992 99.3326 0
*/
方法三:FILEPROPERTY
另一个选项是使用FILEPROPERTY函数的SpaceUsed属性,它将告诉我们使用了多少空间,然后我们可以基于当前的大小来计算可用空间
SELECT DB_NAME() AS DbName,
name AS FileName,
size/128.0 AS CurrentSizeMB,
size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0
AS FreeSpaceMB
FROM sys.database_files;
/*
DbName FileName CurrentSizeMB FreeSpaceMB
--------------------------------------------------------
db_Sunrise db_Sunrise 976.375000 281.312500
db_Sunrise db_Sunrise_log 70.562500 2.289063
db_Sunrise db_Sunrise_1 363.562500 94.687500
*/