行大小开销

时间:2013-02-06 00:06:36

标签: sql-server database sql-server-2008 sqldatatypes

我在共享主机上有一个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个额外字节是什么???

2 个答案:

答案 0 :(得分:6)

这3个额外来自NULL位图。 According to Paul's post,它存在于每一行,除了那些列中的SPARSE(从SQL Server 2008开始)。

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

答案 1 :(得分:1)

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

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

在您的情况下, 3列因此只有 1个字节

相关问题