Database 何时保存时间序列数据

Database 何时保存时间序列数据,database,time-series,Database,Time Series,我们正在收集大约30000种金融工具的市场数据。我们希望每10分钟左右保存一次历史数据。它们都保存在PostgreSQL表中。我正在讨论两种方法: “快照” 每10分钟存储一次所有符号的价格,带有漂亮的圆形时间戳 优点: 使查询变得容易,因为时间戳是通过四舍五入到最后10分钟的倍数预先知道的 缺点: 较大的数据集 大的插入将影响性能 在不存储额外信息的情况下,不会传达仪器数据更改的频率 “滚动更新” 如果自上次更新后经过的时间超过10分钟,则仅在更新时存储每个符号 优点: 越来越少(便

我们正在收集大约30000种金融工具的市场数据。我们希望每10分钟左右保存一次历史数据。它们都保存在PostgreSQL表中。我正在讨论两种方法:

“快照” 每10分钟存储一次所有符号的价格,带有漂亮的圆形时间戳

优点:

  • 使查询变得容易,因为时间戳是通过四舍五入到最后10分钟的倍数预先知道的
缺点:

  • 较大的数据集
  • 大的插入将影响性能
  • 在不存储额外信息的情况下,不会传达仪器数据更改的频率
“滚动更新” 如果自上次更新后经过的时间超过10分钟,则仅在更新时存储每个符号

优点:

  • 越来越少(便宜)的插件
  • 较小的数据集
  • 数据将更准确地反映实际变化频率(对于每10分钟变化少于一次的仪器)
缺点:

  • 查询将更加复杂/昂贵,因为所需行的时间戳未知
考虑
  • 我们的插入比查询多得多
  • 我们希望能够扩展到更多的仪器,可能会有更高频率的更新

我一直在做“滚动更新”,我看不出查询有任何性能问题。表上只有一个多列索引,但插入似乎仍然比查询昂贵得多,因此这似乎是更合适的方法。这是否合理的做法?我还缺少其他注意事项吗?

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

我并没有特别使用圆形时间戳,但如果我们想这样做的话,这将使检索整个快照变得更加容易。此时,我们在单个时间点一次只检索一个符号的数据

我们处理的大多数符号每10分钟变化不止一次,因此在任何情况下,我们的数据集都不能反映这些符号的变化频率


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

快照方法存在一些问题,这是因为并非所有仪器每分钟都会滴答作响,特别是因为您考虑的是30000种工具,其中必须包括一些流动性较低、交易不频繁的工具

滚动更新方法存在到处都有时间戳的问题,这可能会使查询数据时的事情变得复杂


第三种将两者结合在一起的方法效果最好,在解析器上为内存中的所有工具保留“滚动更新”的临时记录,并在10分钟标记处将最新值写入永久表并重新启动临时记录。这种方法还可以很容易地跟踪开盘、高点、低点、收盘和成交量值

你选择了哪种选择?为什么?db是干什么的?事实上,是的。由于我们大部分工作都是使用当前数据进行的,因此数据库中有一个单独的表用于此目的。事实上,某些仪器的更新并不频繁,这本身并不是一个问题。这只是意味着为了简化检索,我们拥有的数据比理论上需要的要多。快照方法不应该比滚动方法拥有更多的数据。。。在这两种情况下,每10分钟为每个仪器保存一个数据点(我猜是OHLCV)。除非我错过了这幅画的一部分?如果有的话,我倾向于存储所有原始消息或以尽可能最小的粒度(比如1分钟)生成数据快照,因为这将使时间窗口大小的更改变得微不足道。。。一个交易者突然决定你需要移动到5或15分钟,这并不意味着回到第1步,只是运行一个脚本。快照当然有更多的数据。正如您所指出的,使用snapshot,我们会每隔一段时间保存所有仪器,但有些仪器很少更改。有了滚动更新,保存的次数就会少很多。我看到你们在linkedin上交易期权,特别是当你们离开钱的时候,期权的速度会非常慢。既然它们不经常滴答作响,为什么不保存每个原始记录,然后在Lambda体系结构上使用批处理对它们进行聚合呢?使用SPARK或STORM等工具,您可以获得所需的信息,并且可以灵活地在未来将分析转移到不同的方向。