where子句不使用clickhouse视图

jyztefdp  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(540)

我试图在源表上创建一个视图,然后从视图中选择特定时间戳范围的数据并将其放入target表中。
我们有一个源表:
100万行被推送到源表中,对应于1月1日到1月31日的数据。

CREATE TABLE IF NOT EXISTS source(
      CELL          String,
      TIMESTAMP     DateTime,
      COUNTER1      Float32,
      COUNTER2      Float32,
      COUNTER3      Float32,
      COUNTER4      Float32,
      COUNTER5      Float32,
      COUNTER6      Float32,
      InsertionTime DateTime DEFAULT now(),      /* Insertion Time */
      QHour         DateTime DEFAULT toStartOfFifteenMinutes(TIMESTAMP)
    ) ENGINE=ReplacingMergeTree()
    PARTITION BY toYYYYMM(TIMESTAMP)
    ORDER BY (QHour, TIMESTAMP, CELL)
    SETTINGS index_granularity = 31768

现在,我们在源表上创建了一个视图。

CREATE VIEW IF NOT EXISTS myView
      AS SELECT
        CELL,
        QHour,
        toStartOfFifteenMinutes(TIMESTAMP)      AS ViewQHour,
        100 * sum(COUNTER1) / sum(COUNTER2)     AS KPI1
      FROM ( 
        SELECT
            CELL,
            TIMESTAMP,
            any(QHour) as QHour
            argMax(COUNTER1, InsertionTime)     AS COUNTER1,
            argMax(COUNTER2, InsertionTime)     AS COUNTER2
        FROM ThreeGCell
        GROUP BY TIMESTAMP, CELL, QHour)
    GROUP BY ViewQHour, CELL
    ORDER BY ViewQHour, CELL

现在,在视图上,我需要从视图中选择一个时间段的数据:1月1日到1月10日。

SELECT * 
FROM myView 
WHERE QHour >= toDateTime('2020-01-01 00:00:00') AND QHour <= toDateTime('2020-01-10 00:00:00')

但是视图上的select查询将所有100万行添加到目标表中,该表是整个1月的数据,而我只查找1月1日到1月10日的特定期间的数据。
我有以下问题:
我们可以修改视图上的查询以只处理特定的时间段吗?
我们能否在源表中动态推送的最新数据集上生成一个视图?我的意思是我们只有来自源表的过滤数据集,并且在视图中使用过滤数据?是否可以修改这些过滤器以使用不同的时间范围?例如,视图中有1月1日到1月10日的数据。在第二轮中,我们得到了从1月11日到1月20日的数据。

djmepvbi

djmepvbi1#

CREATE VIEW IF NOT EXISTS myView
....
ORDER BY ViewQHour, CELL

大多数数据库都禁止使用创建视图 ORDER BY 不幸的是,他没有。在最初的设计中,允许创建这样的视图是一个错误。 ORDER BY 取消 predicate 下推,因为它在某些情况下会破坏结果(优化器仍然很弱,无法理解runningdiff()和neighbor()的情况)。
https://github.com/clickhouse/clickhouse/issues/9425#issuecomment-592658368

相关问题