为什么和什么时候应该使用SPARSE COLUMN? (SQL SERVER 2008)
通过SQL SERVER 2008的新特性SPARSE COLUMN的一些教程后,我发现它不会占用任何空间,如果列值是0或空值,但是当有一个值,它需要4倍的空间常规(非稀疏)列成立。
如果我的理解是正确的,那么为什么我会在数据库devise的时候去做呢? 如果我使用那个,那么在什么情况下,我呢?
同样出于好奇,当列被定义为稀疏列时,怎么没有空间得到保留(我的意思是说,什么是内部实现)
提前致谢
稀疏列不使用4x的空间来存储值,它使用(固定的)每个非空值4个额外的字节 。 (正如你已经说过,NULL需要0空间。)
-
所以存储在比特列中的非空值将是1比特+4字节= 4.125字节。 但是,如果这些中有99%是NULL,那么它仍然是一个净节省。
-
存储在GUID(UniqueIdentifier)列中的非空值是16字节+ 4字节= 20字节。 所以如果只有50%是NULL,这仍然是一个净节省。
所以“预期储蓄”很大程度上取决于我们正在谈论什么样的专栏,以及您对什么比率是空的比非空的估计。 可变宽度列(varchars)可能更难准确预测。
此联机丛书页面有一个表格,显示不同数据types的百分比需要为零,以便最终获得收益。
那么你应该什么时候使用稀疏列? 当您预计有相当比例的行具有NULL值时。 想到一些例子:
- 订单表中的“ 订单退货date ”列。 你会希望只有很less的销售额会导致退货。
- 地址表中的“ 第4个地址 ”行。 大多数邮件地址,即使您需要部门名称和“Care Of”,也可能不需要4条独立的线路。
- 客户表中的“ 后缀 ”列。 一个相当低的百分比的人有一个“Jr.” 或“III”或“Esquire”。
-
在稀疏列中存储空值根本不占用空间。
-
对于任何外部应用程序,该列将performance相同
-
过滤索引的稀疏列效果很好,因为您只想创build索引来处理列中的非空属性。
-
您可以在稀疏列上创build一个列集合,该集合返回集合覆盖的列中所有非空数据的xml剪辑。 列集本身就像一个列一样。 注意:每个表只能设置一列。
-
更改数据捕获和事务复制都可以使用,但不能使用列集function。
缺点
-
如果一个稀疏列有数据,它将比普通列多占用4个字节,例如,即使是一个位(通常0.125字节)是4.125字节,唯一标识符从16字节上升到20个字节。
-
不是所有的数据types都可以是稀疏的:具有FILESTREAM属性的文本,ntext,图像,时间戳,用户定义的数据types,几何或地理或varbinray(max)不能是稀疏的。 (更改17/5/2009感谢亚历克斯发现错字)
-
计算列不能稀疏(尽pipe稀疏列可以参与另一个计算列中的计算)
-
您不能应用规则或具有默认值。
-
稀疏列不能形成聚集索引的一部分。 如果你需要这样做,使用基于稀疏列的计算列,并创build聚集索引(哪种types的对象失败)。
-
合并复制不起作用。
-
数据压缩不起作用。
-
访问(读写)稀疏列更昂贵,但是我一直没有find任何确切的数字。
参考
你读错了 – 它从来不需要4倍的空间。
具体来说,它表示4 *(4字节,见脚注),而不是4x(乘以4)。 唯一的情况是4倍的空间是一个char(4),如果NULL的存在时间超过64%,将会看到节省。
“*长度等于types中包含的数据的平均值,加上2或4个字节。
SQL SERVER – 2008 – SPARSE列简介 – 第2部分 Pinal Dave :
所有SPARSE列都存储在数据库中的一个XML列中。 让我们看看SPARSE列的一些优点和缺点。
SPARSE专栏的优点是:
INSERT,UPDATE和DELETE语句可以通过名称引用稀疏列。 SPARSE列也可以作为一个XML列工作。
SPARSE列可以利用已过滤的索引,其中数据填充在行中。
当数据库中存在零或空值时,SPARSE列会节省大量的数据库空间。
SPARSE列的缺点是:
SPARSE列没有IDENTITY或ROWGUIDCOL属性。
SPARSE列不能应用于文本,ntext,图像,时间戳,几何,地理或用户定义的数据types。
SPARSE列不能有默认值或规则或计算列。
聚集索引或唯一主键索引不能应用SPARSE列。 SPARSE列不能是聚簇索引键的一部分。
包含SPARSE列的表可以具有8018字节的最大大小,而不是常规的8060字节。 涉及SPARSE列的表操作会影响常规列的性能。