【发布时间】:2017-04-26 17:12:15
【问题描述】:
我正在尝试使用我在 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')
【问题讨论】:
标签: sql sql-server sql-server-2014