sql - 为什么以及何时应该使用稀疏列? (SQL 服务器 2008)

标签 sql sql-server database-design sql-server-2008

在阅读了一些有关 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/

相关文章:

sql-server - 如何在使用内连接时在sql server中获取计数?

python - 相互依赖的一对多关系 SQLAlchemy

database - 在数据库中存储年份

MySQL,为什么这个简单的 'CREATE TABLE' 查询失败?

sql - 如何查看 Ruby on Rails 中给定 ActiveRecord 查询将生成的 SQL

sql - 创建单个或多个 SQL 连接以多次执行相同的查询更好吗?

database-design - 外键,它们所属的位置取决于关系

SQL 两天之间每天的小时数差异

mysql - GROUP CONCAT 与 MESQL 中的 ORDER

sql-server - 无法恢复 SQL Server 快照