1

我有以下要优化的 timescaleDB 查询

SELECT 
    sensor_reading.day as day,
    sensor_delta_daily,
    pos1_daily,
    (sensor_delta_daily * 1 * calorific_value_daily) AS calcval1_daily
FROM (
    WITH sensor_counter AS (
    SELECT
      time,
      (LEAD(sensor_delta) OVER (ORDER BY time)/DATE_PART('day',  LEAD(time) OVER (ORDER BY time) - time)) as sensor_delta_daily
    FROM sensor_counter
    WHERE sensor_delta is not null
    ORDER BY time
    )
    SELECT
        time_bucket_gapfill('1 day', time) AS day,
        locf(avg(reading_delta_daily)) AS reading_delta_daily
    FROM energy_counter
    WHERE time between (now() - INTERVAL '2 months') and now()
    GROUP BY day
) AS counter_reading,
(SELECT
        time_bucket_gapfill('1 day', time) AS day,
        locf(avg(calorific_value)) AS calorific_value_daily
    FROM energy_counter_daily_nullable
    WHERE time between (now() - INTERVAL '2 months') AND now()
    AND calorific_value is not null
    GROUP BY day
) AS counter_calorific
WHERE counter_reading.day = counter_calorific.day
;

我的问题是:

  • 由于我将来需要更多的职位,而且这个查询会越来越大,是否可以通过使用连续聚合和物化视图来优化它?
  • 如果是:这会是什么样子?
  • 如果没有:还有其他更好的选择吗?

更详细的解释说明:

我是数据库的新手,尤其是 timescaleDB,并且有一个带有以下场景的小传感器项目:

我有一个返回消耗值的传感器。由于传感器的一些技术限制(大值导致传感器在零点重新启动时溢出),我只存储传感器当前捕获和上次捕获之间的差异(sensor_delta)。此值仅在我插入它的那天有效。但是我可以通过将最新值除以之前消耗值的天数来用有效值填充两个消耗值之间的天数。

还有其他基于时间的数据连接到传感器,但由我自己捕获和存储(pos0_valuepos1_pricepos2_price)。这些是由于不同事件而在不同时间发生变化的值,它们从我插入该值到我插入一个新值都有效。所有这些数据对于我需要的计算都很重要。

所以,这是一大堆胡言乱语。为了更好地理解,这是我拥有的简单数据:

实际数据:

时间 传感器_uuid 传感器增量 pos0_value pos1_value pos2_value
2021-06-20 00:00:00 f5778d7c-46a4-3d6b-8b40-133569cd2f01 514.91 9.85 0.3462 19.8263
2021-06-23 00:00:00 f5778d7c-46a4-3d6b-8b40-133569cd2f01 无效的 无效的 0.2228 无效的
2021-06-27 00:00:00 f5778d7c-46a4-3d6b-8b40-133569cd2f01 无效的 无效的 无效的 18.8928
2021-06-30 00:00:00 f5778d7c-46a4-3d6b-8b40-133569cd2f01 560.28 无效的 无效的 无效的

我想要对这些数据执行以下操作:

  • 计算从最新到上一个条目的每日 sensor_delta (sensor_delta new )
  • 获取查询日期或时间范围的有效值
  • 根据每天记录的数据计算新数据

我需要的日期:

  • calcval1_daily = sensor_delta_daily*pos1_daily+pos0_daily
  • calcval2_daily = sensor_delta_daily+pos2_daily+calcval1_daily
sensor_delta_daily pos0_daily pos1_daily pos2_daily calcval1_daily calcval2_daily
2021-06-20 514.91 9.85 0.3462 19.8263 188,111842 722,848142
2021-06-21 56.028 9.85 0.3462 19.8263 29,2468936 105.1011936
2021-06-22 56.028 9.85 0.3462 19.8263 29,2468936 105.1011936
2021-06-23 56.028 9.85 0.2228 19.8263 22,3330384 98,1873384
2021-06-24 56.028 9.85 0.2228 19.8263 22,3330384 98,1873384
2021-06-25 56.028 9.85 0.2228 19.8263 22,3330384 98,1873384
2021-06-26 56.028 9.85 0.2228 19.8263 22,3330384 98,1873384
2021-06-27 56.028 9.85 0.2228 18.8928 22,3330384 97,2538384
2021-06-28 56.028 9.85 0.2228 18.8928 22,3330384 97,2538384
2021-06-29 56.028 9.85 0.2228 18.8928 22,3330384 97,2538384
2021-06-30 56.028 9.85 0.2228 18.8928 22,3330384 97,2538384
2021-07-01 无效的 9.85 0.2228 18.8928 无效的 无效的
2021-07-02 无效的 9.85 0.2228 18.8928 无效的 无效的
2021-07-03 无效的 9.85 0.2228 18.8928 无效的 无效的

插入下一个 sensor_delta 后,sensor_delta_daily 应该更新到 2021-07-01。


我知道,这很多。我也掌握了这种情况,到目前为止我想出的唯一解决方案是上面提到的查询,它返回了我想要的数据集(我省略了 pos2_value 和 calcval2_daily)。但是我拥有的数据位置越多,Query 堆积的越多,我感觉 Query 变得非常大、不可读且速度慢。

您对如何解决这种情况有任何想法吗?

4

0 回答 0