5

我在共享主机上有一个 MS SQL Server 2008 数据库,我需要尽可能减少使用的存储空间。我最大的表有以下定义:

CREATE TABLE [stage](
    [station_id] [smallint] NOT NULL,
    [time_utc] [smalldatetime] NOT NULL,
    [stage_mm] [smallint] NOT NULL,
CONSTRAINT [PK_stage] PRIMARY KEY CLUSTERED ([station_id] ASC,[time_utc] ASC)

我试图找出表中每条记录的平均字节数。根据理论,大小应该是:4B(行标题)+ 2B(smallint)+ 4B(smalldatetime)+ 2B(smallint),即12个字节。

但是,当我运行命令时:

dbcc showcontig ('stage') with tableresults

它显示: MinimumRecordSize=15, MaximumRecordSize=15 所以根据 SQL Server,每条记录的字节数是 15 而不是 12 当我查看表占用的总磁盘空间并将其除以时,每条记录的 15 字节数似乎也是正确的行数。

什么占用了 3 个额外的字节???

4

2 回答 2

6

额外的 3 个来自 NULL 位图。根据 Paul 的帖子,它位于每一行,除了那些跨列都是 SPARSE 的行(从 SQL Server 2008 开始)。

根据此 BOL 帖子中的一行,NULL 位图 = 2 + ((number_columns_in_clustered_index + 7) / 8)。在你的情况下,3。

于 2013-02-06T00:32:29.817 回答
1

我部分同意@Matt,NULL 位图需要 2 个字节,这是正确的。

但是,最后一个字节被每位的列数消耗。意思是,如果我的表中有 6 列,那么我需要 1 个字节(6 位),或者如果我有 12 列,那么我需要 2 个字节(12 位)。

在您的情况下,有3 列,因此它只占用了1 字节

于 2016-08-18T13:42:44.833 回答