好的,我一直在做一个项目,在这个项目中我需要创建一个SQL“宽表”或一个可以处理超过+1,000列数据的SQL表。为了建立一个例子,让我们假设一行中有1502列:
- 1列专用于“IDINT主键”
- 5列专用于文件信息,使用“FileInfo_1VARCHAR(20)SPARSE,...”
- 1,495列专用于使用“number_info_1真实的SPARSE,...”存储带小数的数字。
- 最后一列包含使用“columnSetXML COLUMN_SET FOR ALL_SPARSE_COLUMNS”的列集合信息
当我在sql中运行测试字符串时:INSERT Test_table(ID, FileInfo_1, FileInfo_2, ...) VALUE(0, 'string1', 'string2', ..., 0.1234, 1.2345, ...)
我遇到了问题,最大行空间量超过了8,060字节的限制。但是根据我所拥有的,总空间不应该小于8,060吗?因为int占用4个字节,所以5 varchar(20)个单元应该占用100个字节(或者10个字节,我不太确定),1,495个真实的单元应该占用5,980个字节,所有这些都小于8060个字节。
我做了一些测试,测试每个真实的单元格使用多少数据,每删除一个真实单元格,我会得到8个字节,这对我来说没有意义,因为它应该只有4个字节,对吗?
有谁能告诉我为什么会发生这种情况吗?我是个新手,我不太清楚为什么真实的细胞需要8个字节而不是4个字节。
1条答案
按热度按时间sigwle7e1#
非空稀疏列值实际上比非稀疏值占用 * 更多 * 空间。当您要存储许多大多数时间为NULL的列时,稀疏列非常有用。
文档中的文章Use Sparse Columns显示,
real
值需要8个字节,而非备用列只需要4个字节,如果每次填充所有这些列,则需要11960个字节。本文展示了每种类型需要多少列为空才能减少40%的空间,在您的例子中,需要大约590个真实的列为空。
如果需要为每一行填充所有1495个值,则应垂直分区表。
如果你不需要从SQL访问单个值,一个选择是将所有数据存储在一个blob字段中,例如
varbinary(max)
或nvarchar(max)
字段。在这种情况下,只有消费应用程序能够使用数据。这也阻止了你对这些值使用任何索引