好吧,所以我一直致力于一个项目,我需要创建一个sql'宽表'或一个可以处理超过+1000列数据的sql表。为了建立一个例子,让我们说连续1502列:
当我在
的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个字节。
答案 0 :(得分:0)
非空稀疏列值实际上比非稀疏值占用更多空间。当您希望存储大多数时间为NULL的许多列时,稀疏列很有用。
文档中的文章Use Sparse Columns显示,当非备用列只需要4个字节时,real
值占用8个字节。如果你每次都填写所有这些,你需要11960个字节。
该文章显示每种类型必须为多少列才能实现40%的空间缩减。在您的情况下,您需要~590个真实列才能为空。
如果需要为每一行填写所有1495个值,则应垂直对表进行分区。
如果您不需要从SQL访问单个值,则可以选择将所有数据存储在blob字段中,例如varbinary(max)
或nvarchar(max)
字段。在这种情况下,只有消费应用程序才能使用数据。这也会阻止您对这些值使用任何索引