为什么&我什么时候应该使用SPARSE COLUMN? (SQL SERVER 2008)

时间:2009-09-09 09:04:48

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

在通过SQL SERVER 2008的新功能SPARSE COLUMN的一些教程之后,我发现如果列值为0或null它不占用任何空间但是当有值时,它需要4倍的空间a常规(非稀疏)列成立。

如果我的理解是正确的,那么为什么我会在数据库设计时采用这种方法呢? 如果我使用它,那么在什么情况下呢?

同样出于好奇,当列被定义为稀疏列时,怎么没有空间得到保留(我的意思是说,内部实现是什么)

提前致谢

5 个答案:

答案 0 :(得分:85)

稀疏列不使用 4x空间量来存储值,它使用每个非空值的(固定) 4个额外字节。 (正如您已经说过的,NULL占用0个空格。)

  • 因此,存储在列中的非空值将为1位+4字节= 4.125字节。但如果其中99%为NULL,那么它仍然是净节省。

  • 存储在 GUID(UniqueIdentifier)列中的非空值为16字节+4字节= 20字节。因此,如果其中只有50%为NULL,那仍然是净节省。

因此,“预期节省”很大程度上取决于我们所讨论的列的种类,以及您对什么比率的估计将为null与非null。可变宽度列(varchars)可能更难以准确预测。

这个Books Online Page有一个表格,显示不同数据类型的百分比需要为空才能获得最终效益。

所以何时你应该使用稀疏列?当您希望相当大比例的行具有NULL值时。想到的一些例子:

  • 订单表中的“订单退货日期”列。您希望销售额的很小一部分会产生退货产品。
  • 地址表中的“第四地址”行。大多数邮寄地址,即使您需要部门名称和“关心”,也可能不需要4个单独的行。
  • 客户表格中的“后缀”列。相当低比例的人有​​“小”。或者名字后面的“III”或“Esquire”。

答案 1 :(得分:23)

  • 在稀疏列中存储空值根本不占用任何空间。

  • 对于任何外部应用程序,该列的行为都相同

  • 稀疏列对过滤索引非常有效,因为您只想创建索引来处理列中的非空属性。

  • 您可以在稀疏列上创建一个列集,该列返回集合所覆盖的列中所有非空数据的xml剪辑。列集的行为类似于列本身。注意:每个表只能设置一列。

  • 更改数据捕获和事务复制都有效,但不适用于列集功能。

<强> 缺点

  • 如果稀疏列中包含数据,则它将比普通列多4个字节,例如偶数(通常为0.125字节)为4.125字节,唯一标识符从16字节增加到20字节。

  • 并非所有数据类型都是稀疏的:带有FILESTREAM属性的text,ntext,image,timestamp,用户定义的数据类型,几何或地理或varbinray(max)不能是稀疏的。 (Changed17 / 5/2009感谢Alex发现错字)

  • 计算列不能稀疏(尽管稀疏列可以参与另一个计算列的计算)

  • 您无法应用规则或具有默认值。

  • 稀疏列不能构成聚簇索引的一部分。如果你需要这样做,可以使用基于稀疏列的计算列,并在其上创建聚簇索引(这种类型会使对象失败)。

  • 合并复制不起作用。

  • 数据压缩不起作用。

  • 对稀疏列的访问(读取和写入)更昂贵,但我无法找到任何确切的数字。

Reference

答案 2 :(得分:4)

你读错了 - 它永远不会占用4倍的空间。

具体来说,它表示4 *(4个字节,见脚注),而不是4x(乘以4)。唯一的情况是它的空间正好是4倍的char(4),如果NULL的存在时间超过64%,就会看到节省。

“*长度等于类型中包含的数据的平均值,加上2或4个字节。”

答案 3 :(得分:0)

| datetime NULL      | datetime SPARSE NULL | datetime SPARSE NULL |
|--------------------|----------------------|----------------------|
| 20171213 (8 bytes) | 20171213 (12 bytes)  | 20171213 (12 bytes)  |
| NULL     (8 bytes) | 20171213 (12 bytes)  | 20171213 (12 bytes)  |
| 20171213 (8 bytes) | NULL      (0 bytes)  | NULL      (0 bytes)  |
| NULL     (8 bytes) | NULL      (0 bytes)  | NULL      (0 bytes)  |

每行不会丢失4个字节;但对于行中每个非空的单元格。

答案 4 :(得分:-2)

SQL SERVER – 2008 – Introduction to SPARSE Columns – Part 2来自Pinal Dave

  

所有SPARSE列都存储为数据库中的一个XML列。让我们   看看SPARSE专栏的一些优点和缺点。

     

SPARSE专栏的优点是:

     
      
  • INSERT,UPDATE和DELETE语句可以按名称引用稀疏列。 SPARSE列也可以作为一个XML列使用。

  •   
  • SPARSE列可以利用已过滤的索引,其中数据在行中填充。

  •   
  • 当数据库中存在零值或空值时,SPARSE列会节省大量数据库空间。

  •   
     

SPARSE专栏的缺点是:

     
      
  • SPARSE列没有IDENTITY或ROWGUIDCOL属性。

  •   
  • SPARSE列不能应用于text,ntext,image,timestamp,geometry,geography或用户定义的数据类型。

  •   
  • SPARSE列不能有默认值或规则或计算列。

  •   
  • 群集索引或唯一主键索引不能应用SPARSE列。 SPARSE列不能是聚簇索引键的一部分。

  •   
  • 包含SPARSE列的表的最大大小为8018字节,而不是常规的8060字节。涉及SPARSE的表操作   列会影响常规列的性能。

  •