检查SQL Server数据库文件

时间:2017-04-26 17:12:16

标签: sql sql-server sql-server-2014

我正在尝试使用我在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_spaceusedsys.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')

2 个答案:

答案 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)

在SSMS中,尝试右键单击数据库,转到报告,然后选择标准报告,然后选择磁盘使用情况。如果这对您不起作用,可能会有其他标准报告之一。

enter image description here

在标准光盘使用情况报告的饼图下方,您可以看到数据文件使用的光盘空间

enter image description here