数据库大小报告的方式与SQL Server中所有表的总和不同

时间:2011-02-07 19:05:05

标签: sql sql-server

我正在尝试确定我的SQL Server数据库是否健康。

我运行了几个命令来检查大小,我对表大小总和与数据库大小之间的差异感到震惊。

我想知道为什么会有这么大的差异。

EXEC sp_spaceused @updateusage = N'TRUE';

database_name | database_size | unallocated space
FleetEquip    |1357.00 MB     |0.20 MB

EXEC sp_MSforeachtable   @command1="EXEC sp_spaceused '?'"

(包含所有表格的格式太多 - HTML表格会很好)

name           | rows   | reserved(KB) | data(KB) | index_size(KB) | unused(KB)
EquipmentState | 131921 | 40648        | 40608    | 8              | 32

所有表的总和为45768 KB

2 个答案:

答案 0 :(得分:3)

您可以使用sp_spaceused

查看EXEC sp_helptext 'sp_spaceused'的定义

虽然我更喜欢以下实际返回的结果格式:

select object_definition(object_id('sp_spaceused')) as [processing-instruction(x)] FOR XML PATH

您可以尝试下面的内容(基于它包含的聚合查询)并查看差异所在吗?

select OBJECT_NAME(p.object_id),
 reservedpages = sum(a.total_pages),
    usedpages = sum(a.used_pages),
    pages = sum(
            CASE
                -- XML-Index and FT-Index internal tables are not considered "data", but is part of "index_size"
                When it.internal_type IN (202,204,211,212,213,214,215,216) Then 0
                When a.type <> 1 Then a.used_pages
                When p.index_id < 2 Then a.data_pages
                Else 0
            END
        )
from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id
    left join sys.internal_tables it on p.object_id = it.object_id
GROUP BY p.object_id
with rollup

答案 1 :(得分:-1)

MSSQL根据需要为其分配内存...但是,当删除行时,数据库不会缩小&#34;。它类似于DOS,偶尔你需要&#34; Defrag&#34;驱动器。有些工具允许您根据需要对数据库进行碎片整理/收缩。