1. 稀疏列是对null值采用优化的存储的普通列。在稀疏列中null不占空间,但代价是检索null值开销增加。它主要是为了提供对可空字段的更好一个存储机制,它可以节省空间(具体说它在真正空值的时候就不占空间),但也会带来一些性能方面的影响。所以要有所权衡。
稀疏列主要使用场景:一个实体有很多属性列,但很多属性都可能填不满。这在以前我们称为属性集问题。稀疏列不是一个数据类型,它是一个列的属性而已。当使用稀疏列后至少能节省20%~40%的空间时才考虑。稀疏列使用SPARSE关键字来表示。
稀疏列主要使用场景:一个实体有很多属性列,但很多属性都可能填不满。这在以前我们称为属性集问题。稀疏列不是一个数据类型,它是一个列的属性而已。当使用稀疏列后至少能节省20%~40%的空间时才考虑。稀疏列使用SPARSE关键字来表示。
2. 列集是可以定义所有稀疏列的集合。这是一个XML数据类型。如果为多个稀疏列定义了一个列集,那么针对这些列的修改,就既可以直接修改这些列,也可以通过一次性通过修改列集字段来完成。列集字段其实是一个计算字段。
有意思的是,此时如果再以SELECT *的语法查询该表的话,那些稀疏列默认是不会被返回的,而只是返回列集
例 如使用创建一个表t1,其中定义有C1,c2,c3这三个列,C2,C3允许为NULL,将其创建为稀疏列,对应脚本为
create table t1
( c1 int identity primary key,
c2 varchar(20) sparse null,--定义为稀疏列
c3 nvarchar(10)sparse null--定义为稀疏列
)
稀疏列必须为null,并且不能有ROWGUIDCOL或IDENTITY属性。它不能默认值。不能绑定到规则。
例 如使用创建一个表t1,其中定义有C1,c2,c3这三个列,C2,C3允许为NULL,将其创建为稀疏列,对应脚本为
create table t1
( c1 int identity primary key,
c2 varchar(20) sparse null,--定义为稀疏列
c3 nvarchar(10)sparse null--定义为稀疏列
)
稀疏列必须为null,并且不能有ROWGUIDCOL或IDENTITY属性。它不能默认值。不能绑定到规则。
创建一个表t2,其中包括列集如
create table t2
( c1 int identity primary key,
c2 varchar(20) sparse null,
c3 varchar(10) sparse null,
c4 xml column_set for all_sparse_columns --列集
)
insert into t2(C2,C3) values('a','aa'),('b',null),(null,'cc'')
select c1,c4 from t2
create table t2
( c1 int identity primary key,
c2 varchar(20) sparse null,
c3 varchar(10) sparse null,
c4 xml column_set for all_sparse_columns --列集
)
insert into t2(C2,C3) values('a','aa'),('b',null),(null,'cc'')
select c1,c4 from t2
转载于:https://blog.51cto.com/dusong/243885