我们正在运行一个数据库的支持网络应用程序进行数据分析,目前基于C#.NET 与EntityFramework在服务器上,并主要HTML+Javascript框架对客户的侧面(网基础)。
我们的应用程序,定期测量接收X/Y数据点的批量大金额,即1e6或更多,上载的通过用户或接收由其他基础设施。
目前,我们有一个表中的数据库被称为 Values
与 id, series_id as int; x, y, z as float
. 这表 BULK INSERT
充满了时的数据的一个客户上载,以及相关元数据保存在一个 Series
表。 总db大小目前接近1TB99.99%是 Values
数据。
这种方法很简单,以实现但也有几个缺点,这使它复杂和缓慢的过时间:
- 我们要插入的大块不过载IIS过程中其预处理它(目前200'000个数据点的每块)
- IIS进程的存储期间的要求插入是巨大(>1500MB为200兆流量的数据)
- 插入是过于缓慢(5百万个记录的是100MB,这需要>30秒插入甚至使用大容量插入)
- 在插入的整个表被锁定,即只有一个用户可以插入在一个时间
- 检索的数据也是相当缓慢,要求1e6记录有时需要>10秒
- 删除系列与>1e6的记录,定期引起的超时上网的应用程序的一侧。
数据是从来没有部分地选择,因此我们真的不需要有在一个表中。 但它是'薄'显示之前发送给客户,即1e6记录是默认情况下,即在99%的情况下使用减少到2000年或10'000记录之前发送给客户。 这是缓存在的客户,但是,如果新客户的要求相同的设置,它再次处理。 该值表还有一个索引 series_id
这需要更多的磁盘空间的比该表本身。
我想知道是否它将是有意义的改变这种格式存储以BLOB储存在"价值观"与其自己的数据格式(CSV函或二元),以及-也许-额外的列有预处理过'减'的数据集显示,它可能推动客户无变化(例如。 关系图来描述软件所需的依赖). 因此新的 Values
表格式会是什么样
id, series_id, data(blob), reduced_data(blob)
会是只是一个 Value
每 Series
项,不1e6或更多。 减少的数据集将是一次创建时上载的数据是收到后用于显示,当客户要求
我将失去部分选择的 values
通过身份证或X/Y值的,但是价值观是永远不会选择的基础上比其他任何东西 id
或 series_id
因此,这是 目前 不是一个限制。 这是我的问题:
- 这是否有意义? 我期待建立和删除一个大BLOB数据集能总是显着快于建立和删除1,000,000个单一的记录。 真的吗?
- 二进制BLOB或CSV/JSON/..BLOB? 最简单的办法BLOB存储当然是创建一个巨大的CSV函块和保存(可能压缩)在数据库。 一个自定义的二进制数据的格式将会更小,但它必须要转换叉之前发送给客户。
我有一种感觉的额外麻烦来的二进制数据格式可能是不值得的,它是更好地gzip CSV/JSON blob于创造一个二元格式。 真的吗?
怎么其它的缺点的斑点,我甚至可能不知道的吗? 尺寸限制似乎并不是一个问题, varbinary(MAX)
是足够的。 我不需要索引的价值观念的 内部 blob,只是在元数据(这是该系列中的表格)。
想法?