我面临着 TimescaleDB 连续聚合的一些性能问题,并且我不完全理解为什么会发生这种情况。
我有一个时间序列数据表:
CREATE TABLE IF NOT EXISTS ack_alarm_number
(
time TIMESTAMP NOT NULL,
entity_id INT,
user_id VARCHAR(255),
value INT
);
SELECT create_hypertable('ack_alarm_number', 'time', if_not_exists => TRUE);
Run Code Online (Sandbox Code Playgroud)
我想通过entity_id或/和user_id从我的表中获取每日平均值,而且我预计我的表将有很多行并且聚合查询可能会很慢,所以我决定创建一个连续聚合:
CREATE MATERIALIZED VIEW IF NOT EXISTS ack_alarm_number_daily
WITH (timescaledb.continuous) AS
SELECT time_bucket(INTERVAL '1 day', time) AS bucket,
entity_id, user_id,
AVG(value)
FROM ack_alarm_number
GROUP BY entity_id, user_id, bucket;
Run Code Online (Sandbox Code Playgroud)
之后我生成了约 700 万行,时间间隔约为 3 个月。
当我执行这样的查询时,它工作得很好:
select bucket, avg(m.avg)
from ack_alarm_number_daily m
where m.entity_id = 2
group by bucket
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试执行以下查询以获得所有实体的平均数时,它变得非常慢〜15秒:
select bucket, avg(m.avg)
from …Run Code Online (Sandbox Code Playgroud)