2013-02-06 34 views
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服务器,每个记录的字节数是15而不是12 数15个字节每个记录看起来也是正确的,当我查看表中的总磁盘空间并将其除以行数。

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

回答

5

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

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

+0

谢谢你的解释。所以看来,在我的情况下,不可能将SQL Server 2008中的行开销减少到少于7个字节。 – jirikadlec2

1

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

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

在你的情况下有3列因此它只采取了1字节