【问题标题】:Row size overhead行大小开销
【发布时间】:2013-01-21 01:48:34
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的解释。因此,就我而言,似乎不可能将 SQL Server 2008 中的行开销减少到 7 个字节以下。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2012-07-06
      • 2012-11-10
      • 2013-08-05
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多