我正在尝试使用我在SO上找到的稍微修改过的查询版本来确定SQL Server数据库文件中有多少可用空间。
SELECT
GETDATE() AS [Timestamp],
[TYPE] = A.TYPE_DESC,
[FILE_Name] = A.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),
[FILEGROUP_NAME] = fg.name,
[File_Location] = A.PHYSICAL_NAME
FROM
sys.database_files A
LEFT JOIN
sys.filegroups fg ON A.data_space_id = fg.data_space_id
WHERE
A.TYPE_DESC NOT LIKE 'LOG'
ORDER BY
A.TYPE desc, A.NAME;
由于数据库从数据库中删除时数据库文件没有收缩,因此查询并不能完全提供我要查找的所有信息。
有没有办法说明SpaceUsed
文件属性中包含多少实际数据(由于删除的记录等对可用空间)?或者是执行DBCC SHRINKDATABASE
之类的操作并更改文件的物理大小的唯一选项?
我查看过sp_spaceused
,sys.dm_db_index_physical_stats
以及其他一些事情,但到目前为止还没有找到解决方案。
更新:我发现了一些我认为更接近我需要的东西,虽然我不确定它是否正确。计算使用的页面数/平均页面空间使用的空间看起来像是一个接近我所期望的值。
SELECT
page_count,
avg_page_space_used_in_percent
FROM
sys.dm_db_index_physical_stats(db_id('TestDB'), NULL, NULL, NULL, 'Detailed')
答案 0 :(得分:1)
有几种方法可以做到这一点,我个人最喜欢的是未记录的DBCC命令ShowFileStats。它输出数据库的数据文件列表,磁盘上的扩展区总数以及实际使用的扩展区数。
对于那些不记得的人,范围是8页,页面大小是8千字节。因此,对这两个输出进行一些数学计算可以为您提供所需的信息。这是一个快速示例脚本。
请注意,DBCC命令在当前数据库的上下文中运行。您可以修改它并将其转换为一个小循环。
IF OBJECT_ID('tempdb..#tempDataUsage') IS NOT NULL DROP TABLE #tempDataUsage
CREATE TABLE #tempDataUsage
(
[Fileid] INT,
[FileGroup] INT,
[TotalExtents] BIGINT,
[UsedExtents] BIGINT,
[Name] sysname,
[FileName] varchar(256)
)
DECLARE @SQLStatement NVARCHAR(400) = 'USE msdb
DBCC ShowFileStats'
INSERT INTO #tempDataUsage
EXEC (@SQLStatement)
SELECT
(TotalExtents * 8 * 8) AS totalSpaceOndiskKB,
(UsedExtents * 8 * 8) AS SpaceActuallyUsedKB,
Name AS DbName,
FileName
FROM
#tempDataUsage
答案 1 :(得分:0)