【问题标题】:Storage of Bit columns for null values?存储空值的位列?
【发布时间】:2019-04-30 00:07:40
【问题描述】:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017 的 Microsoft 文档说:

整数数据类型,可以取值 1、0 或 NULL。

SQL Server 数据库引擎优化了位列的存储。如果表中有 8 个或更少的位列,则这些列存储为 1 个字节。如果有 9 到 16 位列,则这些列存储为 2 个字节,依此类推。 字符串值 TRUE 和 FALSE 可以转换为位值:TRUE 转换为 1,FALSE 转换为 0。 转换为位会将任何非零值提升为 1。

如何将 1、0 和 NULL 存储在一个位中?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    引用@MarkByers 在问题How much size “Null” value takes in SQL Server 中关于SQL Server 如何存储NULL 的规范答案:

    除了存储空值所需的空间之外,还有一个可以为空的列的开销。对于每一行,每个可空列使用一位来标记该列的值是否为空。无论列是固定长度还是可变长度都是如此。

    因此,我希望 BIT 类型的行为与任何其他列相同,这意味着将有一个单独的位来跟踪该列是 NULL 还是 NULL。因此,SQL Server 中的 BIT 列实际上使用 两个 位来跟踪三个值。

    【讨论】:

    • 这句话虽然不太正确。 所有 列在空位图中都有相应的位,而不仅仅是可空位。这就是为什么 not null -> null 对列的更改只是元数据更新。
    • @Damien_The_Unbeliever 然后也许编辑其他问题。或者,更好的是,编辑我的问题,然后给我看一些绿色!
    【解决方案2】:

    行标题中有一个NULL bitmap mask,用于跟踪哪些列是否为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多