【问题标题】:Do null values save storage space? [duplicate]空值是否节省存储空间? [复制]
【发布时间】:2010-12-28 13:07:01
【问题描述】:

可能重复:
Space used by nulls in database

在存储空间方面什么更有效?

  • nullable int 列中充满了空值。
  • int 列全为零。

我知道一个可为空的列占用 1 位额外的信息来存储它的空状态,但是空值是否可以避免数据库为一个为空的 int 分配 32 位?

(空语义和空的含义对于这个问题并不重要)

【问题讨论】:

  • 我正在使用 2008 R2,但如果其他版本的行为有所不同,很高兴知道。
  • D'oh,我搜索了“空存储”,但没有搜索“空空间”。同意重复,那里的答案回答了这个问题。

标签: sql-server database null


【解决方案1】:

对于像 nullable int 这样的固定宽度字段,无论值是否为空,所需的存储空间始终相同。

对于可变宽度可为空的字段,值“NULL”占用零字节的存储空间(忽略存储值是否为空的位)。

【讨论】:

  • 这个有参考还是你从实验证据中知道的?
  • 我知道,因为几乎每周都会有人问这个问题。 ;-)
  • 我可能不太明白何时 SQL Server 为一列(或者,实际上是一行)保留了空间,但事实是添加一个可为空的列到一个巨大的数据库实际上是瞬时的,并且似乎不涉及任何分配(例如,如果您使用默认值指定 NOT NULL,则会发生这种情况)。这是否意味着当您第一次尝试写入包含该值的行时,SQL Server 将为该新列分配大量空间?
【解决方案2】:

如果您使用的是 SQL Server 2008,并且希望列中有大量 NULL 值,我建议您使用investigate Sparse Columns。它们针对存储 NULL 值进行了优化。

【讨论】:

    【解决方案3】:

    SQL Server 2008 为主要为 NULL 的列引入了Sparse columns

    行的 SPARSE 列(为 NULL)使用 0 位存储。但是如果有值,你需要支付 4 字节的惩罚。

    【讨论】:

      【解决方案4】:

      0 不为空。如果您没有该字段的值,请不要在其中粘贴零!我无法告诉你我遇到过多少次基本上无法修复的错误,因为我们无法知道生产数据库中的零是真正的零还是假的零。拥抱空值 - 是的,它们需要更多的编码,但无论如何都要接受它们。

      【讨论】:

      • 在这种情况下,该字段只是一个应用程序标志,检查零或空是相同的,因此只是存储考虑。
      猜你喜欢
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多