在数据库中有效地子采样时间序列数据

时间:2012-10-15 14:25:24

标签: ajax postgresql data-visualization

我有一个存储在PostgreSQL数据库中的值的时间序列(例如,股票市场价格的随机游走)。这是一个非常大的表,我希望能够同样快速地处理任意时间跨度的查询。我心中有this chart,我想知道他们是怎么做到的。

一个简单的例子:

WITH t(ts, val) AS ( VALUES
    ('2012-10-04 00:00:00'::timestamp, 1.11::numeric),
    ('2012-10-04 00:00:01', 1.21),
    ('2012-10-04 00:00:02', 1.25),
    ('2012-10-04 00:00:03', 1.41),
    ('2012-10-04 00:00:04', 1.31),
    ('2012-10-04 00:00:05', 1.25),
    ('2012-10-04 00:00:06', 1.33))

(假设时间戳列上有一个索引。)该表很大,并且需要很长时间来检索例如一年四分之一的时间跨度的所有值。但是,由于我想对这些数据做的只是制作一个可视化全局趋势的图,我并不需要从那个时期获得整个数据集,但代表性的子集会没问题。

我想到的事情:

  • 生成一个子语句列表,每个子语句检索一个短子时间间隔的任意值(例如,每小时间隔一个值)。
  • 汇总值,例如AVG()date_trunc('hour', ts)或类似的分组(但这会更快吗?可能会创建另一个包含预聚合值的表吗?)

有没有可行的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

我的第一个冲动是使用聚合数据创建物化视图。这应该非常快(不计算创建它的一次性操作。)

除此之外,如果您不想在数据库中创建更多对象,(真正)随机选择与索引相结合可能会快速且有效。

根据表格的具体情况和实际尺寸以及结果准确程度的要求,您可以将某些内容从along these lines拉出来,这可能会相对较快。