表大小总和与 mdf 大小不匹配

Edu*_*ada 4 sql-server disk-space

我刚刚在我的数据库上运行了一份磁盘使用情况报告,发现它在过去一个月中增长了很多,目前在数据上使用了 3.98 GB(上个月大约是 300 MB)

磁盘使用报告

但是,当我按表运行磁盘使用情况报告时,我发现表中的空间使用情况目前与 3.98 GB 相差甚远

在此处输入图片说明

我如何才能找到正在使用剩余空间的内容,以便将其加起来为 3.98 GB?

编辑

这是“收缩文件”对话框的屏幕截图:

收缩对话框

Sol*_*zky 6

有些“内部”表、队列等不会出现在某些报告/查询中,因为它们是系统对象。如果您运行下面的查询,它计算当前数据库中数据文件中定义的实际页面数,您应该看到“保留”字段之一(匹配适当的“KB”、“MB”或“GB”) " 字段)与该报告的数据文件部分中的“已用空间”值匹配。

;WITH cte AS
(
  SELECT COUNT(*) AS [Reserved],
         SUM(CASE WHEN pa.[is_allocated] = 1 THEN 1 ELSE 0 END) AS [Allocated]
  FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
)
SELECT  [Reserved] AS [ReservedPages],
        [Allocated] AS [AllocatedPages],
        '---' AS [---],
        ([Reserved] * 8) AS [ReservedKB],
        ([Allocated] * 8) AS [AllocatedKB],
        '---' AS [---],
        ([Reserved] * 8) / 1024.0 AS [ReservedMB],
        ([Allocated] * 8) / 1024.0 AS [AllocatedMB],
        '---' AS [---],
        ([Reserved] * 8) / 1024.0 / 1024.0 AS [ReservedGB],
        ([Allocated] * 8) / 1024.0 / 1024.0 AS [AllocatedGB]
FROM    cte;
Run Code Online (Sandbox Code Playgroud)

下面是获取每个对象详细信息以及顶部总计行的查询:

SELECT sch.[name], obj.[name], ISNULL(obj.[type_desc], N'TOTAL:') AS [type_desc],
       COUNT(*) AS [ReservedPages],
       (COUNT(*) * 8) AS [ReservedKB],
       (COUNT(*) * 8) / 1024.0 AS [ReservedMB],
       (COUNT(*) * 8) / 1024.0 / 1024.0 AS [ReservedGB]
FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
INNER JOIN sys.all_objects obj
        ON obj.[object_id] = pa.[object_id]
INNER JOIN sys.schemas sch
        ON sch.[schema_id] = obj.[schema_id]
GROUP BY GROUPING SETS ((sch.[name], obj.[name], obj.[type_desc]), ())
ORDER BY [ReservedPages] DESC;
Run Code Online (Sandbox Code Playgroud)

  • 第二个查询找到了 sys.sysdercv 表,这是一个与服务代理相关的表,据报告在某些情况下会增长,目前在我的数据库中占用 3.15 GB,所以现在报告中的数字加起来为 3.98 GB (2认同)