代码之家  ›  专栏  ›  技术社区  ›  Sprague

SQL Server可空值存储影响

  •  4
  • Sprague  · 技术社区  · 14 年前

    比较将不是空值与存储在同一列中的非空值,而是存储在可空列中的空值和存储在非空列中的实际值。

    3 回复  |  直到 14 年前
        1
  •  4
  •   gbn    14 年前

    可变长度列的空值存储在空位图中,该位图至少自SQLServer2000以来出现在每条记录中:列本身不使用任何空间。(编辑:长度为2字节,当然为零)

    对于定长列,空位图表示在定长列的存储所占用的空间中不需要sentinel值。

    撇开索引不谈,空值比较会更快,因为这一点,以及与空值的比较总是未知的(这会变成false)

    编辑:

    保罗·兰德尔的 Inside the Storage Engine: Anatomy of a record 显示在磁盘上的结构+解释空位图优化+如何存储固定和可变长度列

    编辑2:再次阅读问题。。。

    从存储的角度来看,空位图可能不会是一个优化,因为它添加了一个字节(或几个字节)。但是,在实践中,它避免了寻找空值的大量处理。

        2
  •  1
  •   David Conde    14 年前

    假设表中有空值,它们不占用任何空间,这非常好,但一旦将一些数据放入该空间,就需要将所有数据移到后面,以便为新数据腾出空间,这样做的代价比不预先为可空字段分配硬盘空间的代价更大。

    长话短说,数据库适用于硬盘没有问题的环境,所以这么小的优化不是很重要,因此每个记录中都有一个可为null的标志,如果为true,则记录为null,否则它有一个值。

    希望我的解释有帮助

        3
  •  0
  •   Raj More    14 年前

    空标志存储在每行的开头,但磁盘上的结构是固定大小的重复结构。

    Create Table XX
    (
       Id Int Identity (1, 1)
       FirstName VarChar (20) NULL,
       LastName Varchar (20) NOT NULL
    )
    

    无论您向每一行输入了多少数据,每一行都将占用相同的空间。