SQL - 稀疏表,总大小和单元格空间

时间:2016-08-09 13:12:01

标签: c# sql-server

好吧,所以我一直致力于一个项目,我需要创建一个sql'宽表'或一个可以处理超过+1000列数据的sql表。为了建立一个例子,让我们说连续1502列:

  • 1列专用于“ID INT PRIMARY KEY”
  • 使用“FileInfo_1 VARCHAR(20)SPARSE
  • 专用于文件信息的5列
  • 1495列专门用于存储带小数的数字,使用“number_info_1 REAL SPARSE ,...”
  • 最后一列包含使用“columnSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
  • 的列集信息

当我在

的sql中运行测试字符串时

INSERT Test_table(ID, FileInfo_1, FileInfo_2, ...) VALUE(0, 'string1', 'string2', ..., 0.1234, 1.2345, ...)

我遇到问题 最大行空间超出8060字节限制。但鉴于我所拥有的,总空间不应该小于8060吗?由于int需要4个字节,因此5个varchar(20)单元应占用100个字节(或10个字节,我不太确定),1495个实际单元应占用5980个字节,所有这些小于8060。

我做了一些关于每个真实单元使用了多少数据的测试,对于我删除的每个真实单元,我得到了8个字节。这对我来说没有意义,因为它应该只有4个字节,对吗?

有人能告诉我为什么会这样吗?我是新手,我不确定为什么真正的单元格需要8个字节而不是4个字节。

1 个答案:

答案 0 :(得分:0)

非空稀疏列值实际上比非稀疏值占用更多空间。当您希望存储大多数时间为NULL的许多列时,稀疏列很有用。

文档中的文章Use Sparse Columns显示,当非备用列只需要4个字节时,real值占用8个字节。如果你每次都填写所有这些,你需要11960个字节。

该文章显示每种类型必须为多少列才能实现40%的空间缩减。在您的情况下,您需要~590个真实列才能为空。

如果需要为每一行填写所有1495个值,则应垂直对表进行分区。

如果您不需要从SQL访问单个值,则可以选择将所有数据存储在blob字段中,例如varbinary(max)nvarchar(max)字段。在这种情况下,只有消费应用程序才能使用数据。这也会阻止您对这些值使用任何索引