Mit*_*eat 6 sql-server-2005 sql-server size
希望这有一个简单的答案,我错过了一些明显的东西。我有一个表,其中行数 * 行大小比表使用的实际数据空间小得多。
如果我运行标准报告“Top Tables 的磁盘使用情况”,我得到的数字是:
# Records Reserved (KB) Data (KB) Indexes (KB) Unused (KB)
33,245 32,962,192 31,070,264 144 1,891,784
Run Code Online (Sandbox Code Playgroud)
这(除非我遗漏了一些东西)意味着每一行占用的空间不到 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
)
Run Code Online (Sandbox Code Playgroud)
它没有索引或键。
一些研究使我想到,也许在过去,表中的可变长度列已被删除,因此我没有更改地运行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 位),Windows NT 5.2(内部版本 3790:Service Pack 2)]
更新:我很确定这是由于病理性碎片化的 HEAP ......我通过应用聚集索引(根据缺失的索引报告需要索引)重建,并且大小差异已经消失。
从堆中删除时,除非使用表锁,否则可能不会取消分配已分配的空间。请参阅MSDN 上 DELETE 中的“从堆中删除行”
这是碎片化的一个单独问题(当然会发生)
以防万一,您是否尝试过此操作来更新使用信息?
EXEC sp_spaceused 'MySchema.MyTable', 'true'
Run Code Online (Sandbox Code Playgroud)
由于没有索引或键,您无法正常对其进行碎片整理。
你可以添加/删除一个聚集索引,或者做这样的事情
SELECT * INTO [MySchema].[MyTableNew]
FROM [MySchema].[MyTable]
-- ORDER BY something
-- if you like
EXEC sp_spaceused 'MySchema.MyTableNew', 'true'
DROP TABLE [MySchema].[MyTable];
EXEC sp_rename 'MySchema.MyTableNew', 'MyTable';
Run Code Online (Sandbox Code Playgroud)
哎呀:刚看到更新,我的互联网断断续续地断断续续......