更新时间:2024-04-29 GMT+08:00

CREATE MATERIALIZED VIEW

本章节介绍如何在ClickHouse中创建物化视图。

创建物化视图

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]Materialized_name [TO[db.]name] [ON CLUSTERClickHouse集群名] 
ENGINE = engine_name()
ORDER BY expr 
[POPULATE] 
AS SELECT ...
表1 参数说明

参数

说明

db

数据库的名称,默认为当前选择的数据库。

Materialized_name

物化视图名。

TO[db.]name

将物化视图的数据写入到新表中。

[ON CLUSTERClickHouse集群名]

在每一个节点上都创建一个物化视图,固定为ON CLUSTER ClickHouse集群名

ENGINE = engine_name()

表引擎类型。

[POPULATE]

POPULATE关键字。如果创建物化视图时指定了POPULATE关键字,则在创建时将SELECT子句所指定的源表数据插入到物化视图中。不指定POPULATE关键字时,物化视图只会包含在物化视图创建后新写入源表的数据。

说明:

一般不推荐使用POPULATE关键字,因为在物化视图创建期间写入源表的数据将不会写入物化视图中。

SELECT ...

SELECT子句。当数据写入物化视图中SELECT子句所指定的源表时,插入的数据会通过SELECT子句查询进行转换并将最终结果插入到物化视图中。

说明:

SELECT查询可以包含DISTINCT、GROUP BY、ORDER BY和LIMIT等,但是相应的转换是在每个插入数据块上独立执行的。

示例:

  1. 创建源表。
    create table DB.table1 ON CLUSTER default_cluster (id Int16,name String) ENGINE = MergeTree() ORDER BY (id);
  2. 插入数据。
    insert into DB.table1 values(1,'X'),(2,'Y'),(3,'Z');
  3. 创建基于源表的物化视图。
    CREATE MATERIALIZED VIEW demo_view ON CLUSTER default_cluster ENGINE = MergeTree() ORDER BY (id) AS SELECT * FROM DB.table1;
  4. 查询物化视图。
    SELECT * FROM demo_view;

    查询数据为空,说明未指定POPULATE关键字时,查询不到物化视图创建前写入源表的数据。

  5. DB.table1表中插如数据。
    insert into demo_view values(4,'x'),(5,'y'),(6,'z');
  6. 查询物化视图。
    SELECT * FROM demo_view;

    查询结果。

    ┌─id─┬─name─┐
    │  4 │ x    │
    │  5 │ y    │
    │  6 │ z    │
    └────┴──────┘