下面我们再来看改为Varchar(5),此时的页信息,如图5所示。


  图5.Varchar(5),每行所占用的空间为20字节

  因此可以看出,Varchar需要额外4个字节来记录其内容长度。因此,当实际列存储的内容长度小于5字节时,使用char而不是varchar会更节省空间。
  关于Null的使用
  关于Null的使用也是略有争议。有些人建议不要允许Null,全部设置成Not Null+Default。这样做是由于SQL Server比较时不会使用三值逻辑(TRUE,FALSE,UNKNOWN),而使用二值逻辑(True,False),并且查询的时候也不再需要IsNull函数来替换Null值。
  但这也引出了一些问题,比如聚合函数的时候,Null值是不参与运算的,而使用Not Null+Default这个值需要做排除处理。
  因此Null的使用还需要按照具体的业务来看。
  考虑使用稀疏列(Sparse)
  稀疏列是对 Null 值采用优化的存储方式的普通列。 稀疏列减少了 Null 值的空间需求,但代价是检索非 Null 值的开销增加。 当至少能够节省 20% 到 40% 的空间时,才应考虑使用稀疏列。
  稀疏列在SSMS中的设置如图6所示。


  图6.稀疏列

  更具体的稀疏列如何能节省空间,请参看MSDN。
  对于主键的选择
  对于主键的选择是表设计的重中之重,因为主键不仅关系到业务模型,更关系到对表数据操作的的效率(因为主键会处于B树的非叶子节点中,对树的高度的影响多)。这个我们得结合主键索引的选择来具体分析,之前写过一篇关于索引的,以后有需要再进一步延伸来讲
  总结
  本篇文章对于设计表时,数据列的选择进行了一些探寻。好的表设计不仅仅是能满足业务需求,还能够满足对性能的优化。