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