实现结果的物化视图

问题描述

我有一个如下表,其中State是一组有限的更新(例如,开始,结束):

CREATE TABLE event_updates (
  event_id Int32,timestamp DateTime,state String
) ENGINE Log;

而且我希望能够迅速运行以下查询:

SELECT count(*)
FROM (
 SELECT event_id,minOrNullIf(timestamp,state = 'Start') as start,state = 'End') as end,end - start as duration,duration < 10 as is_fast,duration > 300 as is_slow
 FROM event_updates
 GROUP BY event_id)
WHERE start >= '2020-08-20 00:00:00'
AND start < '2020-08-20 00:00:00'
AND is_slow;

但是,在有大量数据时,这些查询的速度很慢,我想是因为每一行都需要计算。

示例数据:

┌─event_id─┬───────────timestamp─┬─state─┐
│        1 │ 2020-08-21 09:58:00 │ Start │
│        1 │ 2020-08-21 10:18:00 │ End   │
│        2 │ 2020-08-21 10:23:00 │ Start │
│        2 │ 2020-08-21 10:23:05 │ End   │
│        3 │ 2020-08-21 10:23:00 │ Start │
│        3 │ 2020-08-21 10:24:00 │ End   │
│        3 │ 2020-08-21 11:24:00 │ End   │
│        4 │ 2020-08-21 10:30:00 │ Start │
└──────────┴─────────────────────┴───────┘

查询示例:

SELECT
    event_id,state = 'Start') AS start,state = 'End') AS end,end - start AS duration,duration < 10 AS is_fast,duration > 300 AS is_slow
FROM event_updates
GROUP BY event_id
ORDER BY event_id ASC

┌─event_id─┬───────────────start─┬─────────────────end─┬─duration─┬─is_fast─┬─is_slow─┐
│        1 │ 2020-08-21 09:58:00 │ 2020-08-21 10:18:00 │     1200 │       0 │       1 │
│        2 │ 2020-08-21 10:23:00 │ 2020-08-21 10:23:05 │        5 │       1 │       0 │
│        3 │ 2020-08-21 10:23:00 │ 2020-08-21 10:24:00 │       60 │       0 │       0 │
│        4 │ 2020-08-21 10:30:00 │                ᴺᵁᴸᴸ │     ᴺᵁᴸᴸ │    ᴺᵁᴸᴸ │    ᴺᵁᴸᴸ │
└──────────┴─────────────────────┴─────────────────────┴──────────┴─────────┴─────────┘

我想生成的是一个预先计算的表,例如:

CREATE TABLE event_stats (
  event_id Int32,start Nullable(DateTime),end Nullable(DateTime),duration Nullable(Int32),is_fast Nullable(UInt8),is_slow Nullable(UInt8)
);

但是我不知道如何用实例化视图创建此表或找到更好的方法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)