在阅读了一些有关 SQL Server 2008 新功能“SPARSE COLUMN”的教程后,我发现如果列值为 0 或 NULL,则不会占用任何空间,但当有值时,则需要 4 倍的空间。常规(非稀疏)列所容纳的空间。
如果我的理解是正确的,那么为什么我在数据库设计的时候会这么做呢? 如果我使用它,那么我会在什么情况下?
同样出于好奇,当列被定义为稀疏列时,如何不保留空间(我的意思是,其内部实现是什么?)
最佳答案
稀疏列不使用4倍的空间量来存储值,它为每个非空值使用(固定)4个额外字节。 (正如您已经说过的,NULL 占用 0 空间。)
因此,存储在 bit 列中的非空值将为 1 位 + 4 字节 = 4.125 字节。但如果其中 99% 为 NULL,则仍然是净节省。
存储在GUID(唯一标识符)列中的非空值是 16 字节 + 4 字节 = 20 字节。因此,如果其中只有 50% 为 NULL,那仍然是净节省。
因此,“预期节省”在很大程度上取决于我们所讨论的列的类型,以及您对空值与非空值比率的估计。可变宽度列 (varchar) 可能更难以准确预测。
这个Books Online Page有一个表格显示不同数据类型的百分比需要为 null 才能最终获得 yield 。
那么什么时候应该使用稀疏列?当您期望很大比例的行具有 NULL 值时。我想到的一些例子:
- 订单表中的“订单返回日期”列。您希望只有很小一部分销售额会导致返回。
- 地址表中的“第四地址”行。大多数邮寄地址,即使您需要部门名称和“转交”,也可能不需要 4 行单独的行。
- 客户表中的“后缀”列。拥有“Jr”的人比例相当低。或名字后加“III”或“Esquire”。
关于sql - 为什么以及何时应该使用稀疏列? (SQL 服务器 2008),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1398453/