SQL Server 表大小差异

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 ......我通过应用聚集索引(根据缺失的索引报告需要索引)重建,并且大小差异已经消失。

gbn*_*gbn 6

从堆中删除时,除非使用表锁,否则可能不会取消分配已分配的空间。请参阅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)

哎呀:刚看到更新,我的互联网断断续续地断断续续......