空列会占用表中的空间吗?


20

我有从非常基本的信息保存的表。只是一个标题和一些日期字段。有一个称为注释的字段,该字段为varchar(4000),大多数情况下,我们将其保留为空白,但有时会在此处输入大量数据。这真的是一个糟糕的设计吗?还是这只是效率低下?

我认为为此列创建一个单独的表会更好。

注意:这是sql server 2008

在此处输入图片说明


感谢大家的反馈!我决定保持简单,将列保留在表中,而不要放在另一个表中。但是,我在SQL 2008中使用了SPARSE功能,因此该字段不使用任何空间。

2
只是好奇,什么是“大多数时候”?总共有多少行,这里有多少百分比有价值?只是想知道您是否打算使用SPARSE和不使用SPARSE... 进行任何空间/性能比较?
Aaron Bertrand

Answers:


9

为了获得更可预测的性能(并避免每页行数变化很大),我倾向于将数据存储在相关表中-特别是如果仅在很小的时间内填充了该数据,并且尤其是仅在一些查询。此值所在的行NULL确实会增加空间开销,但这是最小的。更重要的是一页只能容纳两行,而下一页可以容纳500行-这确实会影响统计数据,您最好将其分开,以便将其单独存储,并且不会影响所有操作。核心表。



10

我认为使用单独的表格会更好地提高页面密度并减少碎片,尤其是当您不总是填充该字段时。

  • 数据页可容纳约8000个字节
  • 您有一些行说100字节,有一些行超过4000字节
  • 这些长行将单独位于页面上,而页面的其余部分是“浪费”的空间,您的数据库将占用该空间,但可能永远不会保存数据
  • 如果将数据添加到该较长的字段中以便在一个几乎全页面上记录,则该页面可能会溢出该页面,并导致指向具有该记录其余部分的页面的指针

所有这些空页面和指针都会导致性能下降。如果可以,请对该字段进行规范化。


4

这个问题看起来非常相似:多余的空列会严重影响sql表的大小吗?

看起来答案是肯定的,它确实占用了空间,但是对于具有大量空值的列有一种压缩算法。

就设计而言,我认为将外部表链接到此表将是一种更简洁的设计。具有频繁使用null值的列会使数据库用户的工作更加困难,因为如果他们不小心的话,他们可能会意外地使用null值。因此,使用数据库的代码将需要包含错误检查,并且从那里变得很难看。


2
明确地说,压缩算法仅适用于明确定义为的列SPARSE,而不仅仅是“具有很多空值的列”。
阿龙贝特朗

2

没关系-它已经是varchar列,因此仅在包含数据时才使用空格。如果您有很多像int这样的可为空的固定大小的列,则可能存在空间使用问题。

至于放在另一个桌子上,我不会打扰。 您还可以查看使用varchar(max)和in / out of row选项。 同样,可能还为时过早。


1
过早的优化通常可能是一个实际问题,但这取决于以后重构的成本。如果今天您知道,只有1%的行将在此列中包含数据,并且您希望表随着时间的推移而增长,那么将数据持久保存在当前表中只会在您扩展规模时带来什么价值?我全力避免过早的优化,但是在权衡这样做的长期效果时,有一点是必要的。
阿龙贝特朗

@Aaron Bertrand同意。人们在这里提出性能问题,很容易假设他们可能拥有数百万行的应用程序,因此他们需要使用工具包中的所有武器并牢记所有内容。另一方面,有时用户似乎处在学习曲线的起点,很难要求他们将时间投入到可能应该优先考虑的事情上。同样,使用varchar(max),您可以有效地轻拂开关以开始存储行外。我认为真正的答案是“您没有真正给我们足够的信息来给出明确的答案”。
Cade Roux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.