希望这有一个简单的答案,我错过了一些明显的东西。我有一个表,其中行数 * 行大小比表使用的实际数据空间小得多。
如果我运行标准报告“Top Tables 的磁盘使用情况”,我得到的数字是:
# Records Reserved (KB) Data (KB) Indexes (KB) Unused (KB)
33,245 32,962,192 31,070,264 144 1,891,784
这(除非我遗漏了什么)意味着每一行占用不到 1MB!
表模式(我没有设计)是:
CREATE TABLE [MySchema].[MyTable]
(
[Code] [varchar](4) NOT NULL,
[SomeID] [smallint] NOT NULL,
[SomeID1] [smallint] NOT NULL,
[Updated] [datetime] NOT NULL,
[SomeId2] [int] NULL,
[SomeId3] [int] NULL,
[Somekey] [real] NULL,
[desc1] [char](12) NULL,
[colA] [real] NULL,
[someid4] [char](20) NULL,
[starttime] [real] NULL,
[endtime] [real] NULL,
[duration] [real] NULL,
[reason] [real] NULL,
[status] [real] NULL,
[category] [real] NULL,
[comment] [char](30) NULL,
[ColB] [real] NULL,
[ColC] [real] NULL
)
它没有索引或键。
一些研究让我想到,也许在过去,表中的可变长度列已被删除,所以我运行DBCC CLEANTABLE时没有做任何更改。
SQL Server 2005 x64 Service Pack 3(据我所知,可以从以下版本字符串中得出:
[Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 2009 年 5 月 26 日 14:13:01 版权所有 (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)]
更新:我很确定这是由于 HEAP 病理性碎片造成的……我通过应用聚集索引(根据缺少的索引报告需要索引)进行了重建,并且大小差异已经消失。
当您从堆中删除时,分配的空间可能不会未分配,除非您使用表锁。请参阅MSDN 上 DELETE 中的“从堆中删除行”
这是碎片化的一个单独问题(当然会发生)
以防万一,您是否尝试过此方法来更新使用信息?
没有索引或键,您无法正常对其进行碎片整理。
您可以添加/删除聚集索引,或执行类似的操作
哎呀:刚刚看到更新,我的互联网断断续续......
我使用这个脚本:
它为您提供了每个表的平均行大小,以及您在上面显示的数据,但我倾向于相信它的输出比内置报告多一点:)