3

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

一个简单的例子:

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))

(假设timestamp 列上有一个索引。)该表很大,检索时间跨度(例如,一年四分之一)的所有值需要很长时间。但是,由于我想要对这些数据做的只是绘制一个图表来可视化全球趋势,我并不真的需要从那个时期获取整个数据集,但一个有代表性的子集就可以了。

我想到的事情:

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

有没有办法实现这一目标?

4

1 回答 1

1

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

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

根据表格的具体情况和实际大小以及对结果的精确程度的要求,您可能能够沿着这些路线取得一些成果,这可能会相对较快。

于 2012-10-15T17:12:42.260 回答