我一直在使用sql Server存储几十万个对象的历史时间序列数据,每天观察约100次.我发现查询(给我在时间t1和时间t2之间的对象XYZ的所有值)太慢了(因为我的需要,慢一秒钟).我按时间戳记和对象ID进行索引.
我喜欢使用某些键值仓库(如MongoDB)的想法,但我不知道这是否是这种“适当”的使用,我找不到任何使用这样的东西数据库用于时间序列数据.理想情况下,我可以执行以下查询:
>在时间t1和时间t2之间检索对象XYZ的所有数据
>做上述,但每天返回一个日期点(第一,最后,关闭到时间…)
>检索特定时间戳的所有对象的所有数据
应该对数据进行排序,理想情况下应该是快速写入新数据以及更新现有数据.
似乎我希望通过对象ID以及时间戳进行查询可能需要以不同的方式索引数据库的两个副本以获得最佳性能…任何人都可以构建像这样的系统,使用键值存储,还是HDF5?或者这是完全可以在sql Server中,我只是不做正确吗?
解决方法
听起来像MongoDB是一个很好的合适.更新和插入速度非常快,因此您可能需要为每个事件创建一个文档,例如:
{ object: XYZ,ts : new Date() }
那么你可以索引ts字段,查询也会很快. (顺便说一下,您可以在单个数据库上创建多个索引.)
如何做三个查询:
retrieve all the data for object XYZ
between time t1 and time t2
db.data.find({object : XYZ,ts : {$gt : t1,$lt : t2}})
do the above,but return one date
point per day (first,last,closed to
time t…)
// first db.data.find({object : XYZ,ts : {$gt : new Date(/* start of day */)}}).sort({ts : 1}).limit(1) // last db.data.find({object : XYZ,ts : {$lt : new Date(/* end of day */)}}).sort({ts : -1}).limit(1)
最接近一段时间,您可能需要一个自定义的JavaScript函数,但它是可行的.
retrieve all data for all objects for
a particular timestamp
db.data.find({ts : timestamp})
如果您有任何问题,请随时询问user list,否则其他人可能会想到更简单的获得最近一次性活动的方式.