2017-12-27 590 views
0

我期待实现时间序列数据库,并且我已经通过数据库的各种选项来使用,但是因为我不是那种我选择的知识与PostgreSQL,因为我有点熟悉使用它与Django(特别是由于ORM)。PostgreSQL中的时间序列有很大的查询需求

这个想法是存储4列数据的时间序列(索引除了价格以外)。

timestamp | id | item | price 

我正在寻找添加这些每分钟,大约1500数据点是批量插入每分钟。一个月后,我不再需要它们具体到分钟,每天只需要一个就足够了(在00:00)。

我正确地认为PostgreSQL应该做得很好吗?这将由后端服务,并且需要非常低的延迟(300 ms往返)。

我的主要问题在于理解PostgreSQL是否能够有效地返回数据,即使在给定需求时,例如项目范围,开始和结束时间戳以及请求数据的时间间隔(无需返回所有内容并手动过滤)。

如果我的表包含下列数据的单个项目:

timestamp | id | item | price 
1514391000 01 foo  10 
1514391100 02 foo  20 
1514391200 03 foo  30 
.......... .. ...  .. 
1514392000 11 foo  20 
1514393000 21 foo  20 

我希望能够请求start: 1514391000end: 1514392000step: 200,那么我会希望得到6个结果回来了(1000, 1200,1400,1600,1800和2000)。 PostgreSQL能以高效的方式实现这种功能吗?

我能想到的唯一的事情是插入我的时间序列时,我确保他们的值四舍五入到最接近的分钟,然后我确切地知道要过滤的时间戳而不需要搜索数据库。

我也想知道是否有可能搜索'最近的时间戳'为一个给定的项目,相同的情况。所有这些似乎都可以通过巧妙的时间戳输入来解决,但我不确定这是否可行。

+0

你评价过[Timescale DB](https://www.timescale.com/)吗?它由Postgres构建,以时间序列数据为主要目标。我的公司测试了它的早期版本,发现它对于时间序列查询非常灵活,但我们的要求发生了变化,所以我们最终选择了[Citus](https://www.citusdata.com)。 – bma

+0

很酷,我完全错过了(正在看InfluxDB和类似的东西)。我想知道Timescale数据库是否可以很好地与Django的ORM配合使用,我不介意额外的自定义SQL用于其他任务。我还打算使用这个数据库来处理一些关系问题(指标之外)。 – sof2er

+0

如果Django不能很好地工作,我会感到很惊讶,因为它是Postgresql的核心,并且为了优化时间序列而进行了额外的工作。我最初的要求包括非时间序列报告,并且工作正常(基本上充当普通Postgres服务器)。请注意,我的测试在最大的表中只有80亿行,所以我不能声称已经测试了几十兆兆字节的数据。 – bma

回答

0

我会建议有一个时间戳开始和时间戳结束列。然后你可以随时找到匹配的行。

我在考虑双表解决方案,一个用于更新的数据,一个用于旧数据。

你也应该划分你最近的表格,也许白天。这将使您可以更有效地管理旧数据 - 一次只丢弃一天(或一周或一个月)的数据。

然后,每天(或一周或一个月),将较旧的数据汇总到要存档的记录中。您可以从较新的数据中删除分区。

您可以交换存档分区或使用视图来合并它们。