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

2ledvvac  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(121)

好的,我一直在做一个项目,在这个项目中我需要创建一个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个字节。

sigwle7e

sigwle7e1#

非空稀疏列值实际上比非稀疏值占用 * 更多 * 空间。当您要存储许多大多数时间为NULL的列时,稀疏列非常有用。
文档中的文章Use Sparse Columns显示,real值需要8个字节,而非备用列只需要4个字节,如果每次填充所有这些列,则需要11960个字节。
本文展示了每种类型需要多少列为空才能减少40%的空间,在您的例子中,需要大约590个真实的列为空。
如果需要为每一行填充所有1495个值,则应垂直分区表。
如果你不需要从SQL访问单个值,一个选择是将所有数据存储在一个blob字段中,例如varbinary(max)nvarchar(max)字段。在这种情况下,只有消费应用程序能够使用数据。这也阻止了你对这些值使用任何索引

相关问题