何时保存时间序列数据

时间:2012-02-21 07:17:26

标签: database time-series

我们正在收集约30,000种金融工具的市场数据。我们希望每10分钟左右保留一次历史数据。它全部保存在PostgreSQL表中。我在两种方法之间进行辩论:

“快照”

每10分钟存储所有符号的价格,并有良好的圆形时间戳。

优点:

  • 使查询变得简单,因为时间戳只需通过舍入到最后10分钟的倍数即可知道 a-priori

缺点:

  • 更大的数据集
  • 大插入会影响性能
  • 在不存储其他信息的情况下,不会传达仪器数据更改的频率

“滚动更新”

仅在更新时存储每个符号,如果自上次更新以来经过的时间超过10分钟。

优点:

  • 更少和更小(更便宜)的插页
  • 较小的数据集
  • 数据将更接近地反映实际变化频率(对于每10分钟变化少于一次的仪器)

缺点:

  • 查询将更加复杂/昂贵,因为所需行的时间戳未知。

考虑

  • 我们有比查询更多的插入
  • 我们希望能够扩展到更多的仪器,可能会略微提高频率更新。

我一直在做“滚动更新”,我发现查询没有任何性能问题。表上只有一个多列索引,但插入似乎仍然比查询昂贵得多,所以这似乎是更适合的方法。这是一种合理的方法吗?我还缺少其他考虑因素吗?

2 个答案:

答案 0 :(得分:0)

我正在重新实现我的Feed,并且我正在从滚动更新切换到快照。编码更容易;我不必跟踪何时存储什么。使用二进制副本将数据加载到仔细索引的PostgreSQL表中,因此插入性能不是问题;我们看到的速率至少有几千条记录/秒,这已经足够了。

我没有使用专门的圆形时间戳,但如果我们想这样做,那么检索整个快照会更容易。此时,我们只在一个时间点检索一个符号的数据。

我们处理的大多数符号每10分钟变化一次以上,因此无论如何我们的数据集并不反映这些符号的变化频率。

更新:我们已开始更广泛地使用历史数据。我们现在可以轻松地为单个时间点检索更大的数据块,这是一个真正的好处。

答案 1 :(得分:0)

快照方法存在一些问题,因为并非所有工具都会在每一分钟都打勾,特别是因为您正在考虑一个包含一些流动性较低且可能不经常交易的工具的3​​0,000种工具。

滚动更新方法存在遍布整个地方的时间戳问题,这可能会在查询数据时使事情变得复杂。

将它们组合在一起的第三种方法最有效,您可以在解析器上保留内存中所有仪器的“滚动更新”的临时记录,并在10分钟内将最新值写入永久表并且重启临时记录。这种方法还可以轻松跟踪打开,高,低,关闭和体积值。