如何确定 SQL 数据库文件中的已用/可用空间?

Bra*_*adC 14 sql-server

我通常使用以下方法来确定数据库的每个文件中的可用/已用空间:

Select *, fileproperty(name, 'SpaceUsed') as Used
From dbo.sysfiles
Run Code Online (Sandbox Code Playgroud)

这将返回页面中的总空间和已用空间,然后乘以 8 得到 KB(或除以 128.0 得到 MB)。

我找到了另一个脚本,而不是使用DBCC showfilestatsdbcc sqlperf(logspace)返回 TotalExtents 和 UsedExtents,然后可以乘以 64 得到 KB(或除以 16.0 得到 MB)。

忽略额外的列,这两个是否总是为空闲/总空间提供相同的值?怎么样sp_spaceused

它们的准确性是否都取决于最近的 DBCC UPDATEUSAGE?

是否有另一种更好的方法来确定已用/可用空间?(我需要这个脚本在 SQL 2000、2005 和 2008 服务器上工作)

部分相关:你能有一个部分分配的范围吗?(例如,仅分配了一个范围内的 8 个页面中的 3 个)

Bru*_*uce 40

这个对我有用,似乎在 SQL 2000 到 SQL Server 2012 CTP3 上是一致的:

SELECT RTRIM(name) AS [Segment Name], groupid AS [Group Id], filename AS [File Name],
   CAST(size/128.0 AS DECIMAL(10,2)) AS [Allocated Size in MB],
   CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2)) AS [Space Used in MB],
   CAST([maxsize]/128.0 AS DECIMAL(10,2)) AS [Max in MB],
   CAST(size/128.0-(FILEPROPERTY(name, 'SpaceUsed')/128.0) AS DECIMAL(10,2)) AS [Available Space in MB],
   CAST((CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2))/CAST(size/128.0 AS DECIMAL(10,2)))*100 AS DECIMAL(10,2)) AS [Percent Used]
FROM sysfiles
ORDER BY groupid DESC
Run Code Online (Sandbox Code Playgroud)

Tri Effendi SS建议提供更多信息的替代方案(与 SQL Server 200 不兼容):

USE [database name]
GO
SELECT 
    [TYPE] = A.TYPE_DESC
    ,[FILE_Name] = A.name
    ,[FILEGROUP_NAME] = fg.name
    ,[File_Location] = A.PHYSICAL_NAME
    ,[FILESIZE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0)
    ,[USEDSPACE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0 - ((SIZE/128.0) - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0))
    ,[FREESPACE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)
    ,[FREESPACE_%] = CONVERT(DECIMAL(10,2),((A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)/(A.SIZE/128.0))*100)
    ,[AutoGrow] = 'By ' + CASE is_percent_growth WHEN 0 THEN CAST(growth/128 AS VARCHAR(10)) + ' MB -' 
        WHEN 1 THEN CAST(growth AS VARCHAR(10)) + '% -' ELSE '' END 
        + CASE max_size WHEN 0 THEN 'DISABLED' WHEN -1 THEN ' Unrestricted' 
            ELSE ' Restricted to ' + CAST(max_size/(128*1024) AS VARCHAR(10)) + ' GB' END 
        + CASE is_percent_growth WHEN 1 THEN ' [autogrowth by percent, BAD setting!]' ELSE '' END
FROM sys.database_files A LEFT JOIN sys.filegroups fg ON A.data_space_id = fg.data_space_id 
order by A.TYPE desc, A.NAME; 
Run Code Online (Sandbox Code Playgroud)

  • 第一个给了我“将数字转换为数字数据类型的算术溢出错误。”而最后一个只给出了当前数据库,如果它为所有数据库给出,那就太好了。 (2认同)

归档时间:

查看次数:

165362 次

最近记录:

7 年,9 月 前