5

我正在使用带有 timescaledb 的以下查询从刻度数据库中获取 10 分钟的蜡烛。

SELECT time_bucket('10minute', time) AS min,
 first(ticks, time) AS open,
 last(ticks, time) AS close,
 max(ticks) AS high,
 min(ticks) AS low,
 last(volume, time)-first(volume, time) AS vol
FROM prices
WHERE asset_code = '".$symbol."'
GROUP BY min
ORDER BY min DESC
LIMIT 100

我想确保随着数据库的增长,查询不会在几天后变慢。在任何时候,我都想对过去两天的滴答声而不是整个表运行此查询。所以我想知道有没有一种方法可以限制time_bucket数据库中最后 100000 个刻度的查询。

我也在使用 PDO 查询数据库。

4

1 回答 1

9

TimescaleDB 使用约束排除来消除在回答查询时需要触摸块。我们现在正在进行一些工作,以扩展查询优化以更智能地处理某些类型的 LIMIT 查询,如您的示例所示,这样即使上述内容也只会触及必要的块。

但是现在,有一个非常简单的解决方法:在 WHERE 子句中使用时间谓词而不是 LIMIT。

特别是,假设您通常在每 10 分钟间隔中有一个股票代码,并且您想要 100 个间隔:

SELECT time_bucket('10 minutes', time) AS min,
  first(ticks, time) AS open,
  ...
FROM prices
WHERE asset_code = '".$symbol."'
  AND time > NOW() - interval '1000 minutes'
GROUP BY min
ORDER BY min DESC
于 2018-02-01T13:59:32.777 回答