我一直在使用SQL Server存储数十万个对象的历史时间序列数据,每天大约观察100次。我发现查询(给我时间t1和时间t2之间的对象XYZ的所有值)太慢了(对于我的需求,慢得多于一秒钟)。我正在按时间戳和对象ID编制索引。

我已经考虑过使用诸如MongoDB之类的键值存储来代替,但是我不确定这是否是对这种东西的“适当”使用,并且我找不到使用这种存储的任何提及。时间序列数据数据库。理想情况下,我可以执行以下查询:

  • 检索时间t1和时间t2之间对象XYZ的所有数据
  • 执行上述操作,但是每天返回一个日期点(第一个,最后一个,关闭时间...)
  • 检索特定时间戳记下所有对象的所有数据

  • 应该对数据进行排序,理想情况下,写入新数据以及更新现有数据应该很快。

    似乎我希望通过对象ID和时间戳进行查询可能需要以不同的方式对数据库的两个副本建立索引,以获取最佳性能...任何人都具有使用键值存储构建这样的系统的经验,或HDF5或其他内容?还是这完全可以在SQL Server中完成,而我只是做得不好?

    最佳答案

    听起来MongoDB非常适合。更新和插入非常快,因此您可能想为每个事件创建一个文档,例如:

    {
       object: XYZ,
       ts : new Date()
    }
    

    然后,您可以为ts字段建立索引,查询也将很快。 (顺便说一句,您可以在单个数据库上创建多个索引。)

    如何进行三个查询:


    db.data.find({object : XYZ, ts : {$gt : t1, $lt : t2}})
    


    // 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函数,但这是可行的。


    db.data.find({ts : timestamp})
    

    如果您有任何问题,请随时在user list上提问,其他人也许可以想到一种更简便的方法来获取最近发生的事件。

    10-06 05:38
    查看更多