我们正在收集约30,000种金融工具的市场数据。我们希望每10分钟左右保留一次历史数据。它全部保存在PostgreSQL表中。我在两种方法之间进行辩论:
每10分钟存储所有符号的价格,并有良好的圆形时间戳。
优点:
缺点:
仅在更新时存储每个符号,如果自上次更新以来经过的时间超过10分钟。
优点:
缺点:
我一直在做“滚动更新”,我发现查询没有任何性能问题。表上只有一个多列索引,但插入似乎仍然比查询昂贵得多,所以这似乎是更适合的方法。这是一种合理的方法吗?我还缺少其他考虑因素吗?
答案 0 :(得分:0)
我正在重新实现我的Feed,并且我正在从滚动更新切换到快照。编码更容易;我不必跟踪何时存储什么。使用二进制副本将数据加载到仔细索引的PostgreSQL表中,因此插入性能不是问题;我们看到的速率至少有几千条记录/秒,这已经足够了。
我没有使用专门的圆形时间戳,但如果我们想这样做,那么检索整个快照会更容易。此时,我们只在一个时间点检索一个符号的数据。
我们处理的大多数符号每10分钟变化一次以上,因此无论如何我们的数据集并不反映这些符号的变化频率。
更新:我们已开始更广泛地使用历史数据。我们现在可以轻松地为单个时间点检索更大的数据块,这是一个真正的好处。
答案 1 :(得分:0)
快照方法存在一些问题,因为并非所有工具都会在每一分钟都打勾,特别是因为您正在考虑一个包含一些流动性较低且可能不经常交易的工具的30,000种工具。
滚动更新方法存在遍布整个地方的时间戳问题,这可能会在查询数据时使事情变得复杂。
将它们组合在一起的第三种方法最有效,您可以在解析器上保留内存中所有仪器的“滚动更新”的临时记录,并在10分钟内将最新值写入永久表并且重启临时记录。这种方法还可以轻松跟踪打开,高,低,关闭和体积值。