【发布时间】:2021-11-21 07:50:54
【问题描述】:
我有一个查询,它在 TimescaleDb 中获取多个资产之前 24 小时的最新价格和价格。然后我的应用程序继续计算应用程序端价格变化的百分比。因为可能没有任何交易,时间桶的最新价格可能不可用,所以我需要填补空白“如果这个时间桶没有价值,那么取之前的价值”。然后价格变化作为非规范化值存储在普通 PostgreSQL 表中,以便在普通 PostgreSQL 查询中更快、更有用,查询类似于JOIN latest_price。
查询在 TimescaleDB 连续聚合视图上执行。
我正在使用last(),并且我知道获取最新值是subject to discussion before。但是,在我的问题中,有一种特殊情况是一次获取多个最新和接近最新的值。
目前,我的价格和 24 小时价格增量计算方法使用两个 last() 查询,在生产中计时 100 秒。然而,类似的参考查询不使用last(),但使用天真的GROUP BY,只需1 秒。
优化需要从 TimescaleDB 为一组项目获取多个最新值,然后对它们执行计算的查询的最佳方法是什么?子查询会更快吗?示例子查询是什么样的?
在更新candle_ohlcvx_aggregate_1h 时创建一个存储最新值的触发器是否有意义?触发器是否适用于连续聚合视图?这个触发器是什么样子的?
我的价格计算查询:
-- Get the latest price
SELECT
pair_id,
last(close, bucket) as last_close
FROM candle_ohlcvx_aggregate_15m
WHERE (bucket < :now_ts) AND (pair_id IN :pair_ids)
GROUP BY pair_id;
-- Get the latest price 24h ago
SELECT
pair_id,
last(close, bucket) as last_close
FROM candle_ohlcvx_aggregate_15m
WHERE (bucket < (:now_ts - INTERVAL '1 DAY')) AND (pair_id IN :pair_ids)
GROUP BY pair_id;
我的参考查询没有最后一个时钟 1 秒挂钟时间 - 使用每小时存储桶计算一天的音量,但不使用 last() 填充最后一个值使其快速:
SELECT
pair_id, SUM(buy_volume) + SUM(sell_volume) as vol
FROM candle_ohlcvx_aggregate_1h
WHERE (bucket >= :now_ts - INTERVAL '1 DAY') AND (bucket < :now_ts) AND (pair_id IN :pair_ids)
GROUP BY pair_id
ORDER BY pair_id ASC;
"""
【问题讨论】:
标签: timescaledb