在通过SQL SERVER 2008的新功能SPARSE COLUMN的一些教程之后,我发现如果列值为0或null它不占用任何空间但是当有值时,它需要4倍的空间a常规(非稀疏)列成立。
如果我的理解是正确的,那么为什么我会在数据库设计时采用这种方法呢? 如果我使用它,那么在什么情况下呢?
同样出于好奇,当列被定义为稀疏列时,怎么没有空间得到保留(我的意思是说,内部实现是什么)
提前致谢
答案 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值时。想到的一些例子:
答案 1 :(得分:23)
在稀疏列中存储空值根本不占用任何空间。
对于任何外部应用程序,该列的行为都相同
稀疏列对过滤索引非常有效,因为您只想创建索引来处理列中的非空属性。
您可以在稀疏列上创建一个列集,该列返回集合所覆盖的列中所有非空数据的xml剪辑。列集的行为类似于列本身。注意:每个表只能设置一列。
更改数据捕获和事务复制都有效,但不适用于列集功能。
<强> 缺点 强>
如果稀疏列中包含数据,则它将比普通列多4个字节,例如偶数(通常为0.125字节)为4.125字节,唯一标识符从16字节增加到20字节。
并非所有数据类型都是稀疏的:带有FILESTREAM属性的text,ntext,image,timestamp,用户定义的数据类型,几何或地理或varbinray(max)不能是稀疏的。 (Changed17 / 5/2009感谢Alex发现错字)
计算列不能稀疏(尽管稀疏列可以参与另一个计算列的计算)
您无法应用规则或具有默认值。
稀疏列不能构成聚簇索引的一部分。如果你需要这样做,可以使用基于稀疏列的计算列,并在其上创建聚簇索引(这种类型会使对象失败)。
合并复制不起作用。
数据压缩不起作用。
对稀疏列的访问(读取和写入)更昂贵,但我无法找到任何确切的数字。
答案 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的表操作 列会影响常规列的性能。