在学习SQL Server 2008新功能"稀疏列(SPARSE COLUMN)"的一些教程后,我发现当该列的值为0或NULL时,它不占用任何空间,但当有值时,它占用常规(非稀疏)列所占空间的4倍。
如果我的理解是正确的,那么在数据库设计时为什么要使用稀疏列呢?如果我使用了稀疏列,在什么情况下会被用到呢?
另外出于好奇,当将一列定义为稀疏列时,为什么不需要保留空间 (我的意思是说,内部实现方式是什么?)
在学习SQL Server 2008新功能"稀疏列(SPARSE COLUMN)"的一些教程后,我发现当该列的值为0或NULL时,它不占用任何空间,但当有值时,它占用常规(非稀疏)列所占空间的4倍。
如果我的理解是正确的,那么在数据库设计时为什么要使用稀疏列呢?如果我使用了稀疏列,在什么情况下会被用到呢?
另外出于好奇,当将一列定义为稀疏列时,为什么不需要保留空间 (我的意思是说,内部实现方式是什么?)
稀疏列中存储null不占用空间。
对于任何外部应用程序,该列的行为都是相同的。
使用过滤索引时,稀疏列与之非常相容,因为您只需要创建处理该列中非空属性的索引。
您可以在稀疏列上创建一个列集,该列集返回覆盖集中的所有非空数据的xml剪辑。 列集本身就像一个列。注意:每个表只能有一个列集。
更改数据捕获和事务复制均可使用,但列集功能不能使用。
缺点
如果稀疏列中有数据,则它将比普通列多占用4个字节。 例如,即使是1位(通常为0.125字节),也会占用4.125字节,而唯一标识符从16个字节增加到20个字节。
并非所有数据类型都可以是稀疏列:text、ntext、image、timestamp、用户定义的数据类型、geometry或geography或带有FILESTREAM属性的varbinray(max)不能是稀疏列。(已更正于17/5/2009,感谢Alex发现拼写错误)
计算列不能是稀疏列(虽然稀疏列可以参与另一个计算列的计算)
您无法应用规则或设置默认值。
稀疏列不能成为聚集索引的一部分。 如果需要这样做,请基于稀疏列创建计算列,并在该列上创建聚集索引(这有点违背了其本身的目的)。
合并复制无法使用。
数据压缩无法使用。
访问(读取和写入)稀疏列更加昂贵,但我在这方面没有找到任何确切的数字。
| 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) |
来自SQL SERVER - 2008 - 稀疏列介绍 - 第2部分 by Pinal Dave:
所有的稀疏列都以一个XML列的形式存储在数据库中。让我们来看一下稀疏列的一些优点和缺点。