Estoy enfrentando algunos problemas de rendimiento con los agregados continuos de TimescaleDB y no entiendo completamente por qué sucede.
Tengo una tabla para mis datos de series temporales:
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);Quiero obtener un valor promedio diario de mi tabla por entidad_id o/y usuario_id, también espero que mi tabla tenga muchas filas y que las consultas agregadas sean lentas, así que decidí crear un agregado continuo:
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;Después de eso, generé ~ 7 millones de filas, el intervalo de tiempo es de alrededor de ~ 3 meses.
Funciona bien, cuando ejecuto consultas como esta:
select bucket, avg(m.avg) from ack_alarm_number_daily m where m.entity_id = 2 group by bucketPero cuando trato de ejecutar la siguiente consulta para obtener el número promedio de todas las entidades, se vuelve muy lento ~ 15 segundos:
select bucket, avg(m.avg) from ack_alarm_number_daily m group by bucket Cuando ejecuto el mismo tipo de consulta desde la tabla ack_alarm_number , no es tan lento ~ 400 ms:
select time_bucket('1 day', m.time) as bucket, avg(m.value) from ack_alarm_number m group by bucketTambién hay una diferencia cuando trato de unirme a otra mesa.
Cuando ejecuto la siguiente consulta, son ~ 17 s:
select bucket, avg(m.avg) from ack_alarm_number_daily m join entities e on m.entity_id = e.id where e.category='category-2' group by bucket El mismo tipo de consulta de ack_alarm_number es ~400ms:
select time_bucket('1 day', m.time) as bucket, avg(m.value) from ack_alarm_number m join entities e on m.entity_id = e.id where e.category='category-2' group by bucket Hay un detalle que he encontrado:
No hay una diferencia significativa en el recuento de filas entre la tabla y la vista materializada, porque tengo 1000000 ID de entidad diferentes y 10 ID de usuario y se distribuyeron uniformemente a lo largo de la línea de tiempo durante la generación de datos, por lo que 7 millones de filas no son suficientes para obtener una ventaja real del agregado continuo. en mi caso, pero sigue siendo interesante, incluso si tienen un número de filas similar, ¿por qué hay una diferencia en el rendimiento de la consulta?