pdo - 优化时间尺度查询

标签 pdo psql postgresql-9.6 timescaledb

我正在使用带有 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查询来自 db 的最后 100000 个滴答声。

我也使用 PDO 查询数据库。

最佳答案

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

关于pdo - 优化时间尺度查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548955/

相关文章:

postgresql - 使用等式作为 View 创建的一部分

postgresql - 查询 NOT NULL 但仅当不用作 FK 时

php - 如何使用 PHP 在 mysql 或 pdo 中显示 ALTER 语句的结果?

php - PDO 一般错误 : 2014 Cannot execute queries while other unbuffered queries are active when trying to LOCK TABLES

php - PDO:交易不回滚?

postgresql - psql,无法将数据库内容复制到另一个 - 无法在事务 block 内运行 -

由于数据源名称无效,PHP MySQL 连接无法工作

bash - 如何使用 su -c 和 bash 脚本引用 psql 语句?

postgresql - 为什么 postgres 不能识别我的表字段?

postgresql - 在更新时锁定一个表,在子查询中锁定另一个表,哪个会先被锁定?