CREATE MATERIALIZED VIEW

适用于:勾选“是” Databricks SQL

重要

此功能目前以公共预览版提供。 要注册以进行访问,请填写此表格

具体化视图是预计算结果可用于查询的视图,并且可以更新以反映输入中的更改。 每次刷新具体化视图时,都会重新计算查询结果,以反映上游数据集中的变化。 所有具体化视图都由 DLT 管道支持。 可以手动刷新具体化视图,也可以按计划刷新,或者通过计划包含具体化视图的 DLT 管道来刷新。

语法

CREATE MATERIALIZED VIEW [IF NOT EXISTS]
  view_name
  [ column_list ]
  [ table_constraints ]
  [ view_clauses ]
  AS query

column_list
   ( { column_alias [ COMMENT column_comment | column_constraint ] [...] } [, ...] [ , table_constraint ] [...])

table_constraints
   ( table_constraint [, ...] )

view_clauses
  { PARTITIONED BY (col [, ...]) |
    COMMENT view_comment |
    TBLPROPERTIES clause |
    SCHEDULE [ REFRESH ] CRON cron_string [ AT TIME ZONE timezone_id ] } [...]

parameters

  • IF NOT EXISTS

    如果视图不存在,则创建它。 如果已存在具有此名称的视图,则忽略 CREATE VIEW 语句。

    最多可以指定 IF NOT EXISTSOR REFRESH 中的一项。

  • view_name

    新创建的视图的名称。 完全限定的视图名称必须是独一无二的。

  • column_list

    (可选)在视图的查询结果中标记列。 如果提供列列表,则列别名的数量必须与查询中的表达式数量一致。 如果未指定列列表,则别名派生自视图主体。

    • column_alias

      列别名必须是唯一的。

    • column_comment

      描述列别名的可选 STRING 文本。

    • column_constraint

      重要

      此功能目前以公共预览版提供。

      向具体化视图中的列添加信息性主键或信息性外键约束。 hive_metastore 目录中的具体化视图不支持约束。

  • table_constraint

    重要

    此功能目前以公共预览版提供。

    向具体化视图添加信息性主键或信息性外键约束。 hive-metastore 目录中的具体化视图不支持约束。

  • view_clauses

    为新具体化视图指定分区、注释、用户定义的属性和刷新计划(可选)。 每个子子句只能指定一次。

    • PARTITIONED BY

      表中用于对表进行分区的列可选列表。

    • COMMENT view_comment

      用于描述表的 STRING 文本。

    • TBLPROPERTIES

      可以选择设置一个或多个用户定义的属性。

    • SCHEDULE [ REFRESH ] CRON cron_string [ AT TIME ZONE timezone_id ]

      如果提供计划,则它会流式处理表或具体化视图,以使用给定的 quartz cron 计划刷新其数据。 仅接受 time_zone_values。 不支持 AT TIME ZONE LOCAL。 如果 AT TIME ZONE 不存在,则使用会话时区。 如果 AT TIME ZONE 不存在并且未设置会话时区,则会引发错误。 SCHEDULE 在语义上等效于 SCHEDULE REFRESH

      不能在增量实时表管道定义中使用 SCHEDULE 语法。

  • AS 查询

    从基表或其他视图中构造视图的查询。

所需的权限

创建具体化视图 (MV) 的用户是 MV 所有者,需要具有以下权限:

  • 对 MV 引用的基表的 SELECT 特权。
  • 对目录和将包含该目录的架构的 USAGE 特权。
  • 对 MV 架构的 CREATE 特权。

只有所有者可以 REFRESH MV。

为了让用户能够查询 MV,他们需要:

  • 对目录和包含 MV 的架构的 USAGE 特权。
  • 对具体化视图的 SELECT 特权。

限制

  • 当在可以为 NULL 的列上具有 sum 聚合的具体化视图从该列中移除了最后一个非 NULL 值 - 因此该列中只剩下 NULL 个值时,具体化视图的结果聚合值将返回零而不是 NULL
  • 列引用不需要别名。 非列引用表达式需要别名,如以下示例所示:
    • 允许:SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 不允许:SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 具体化视图不支持标识列或代理项键。
  • 具体化视图不支持临时 OPTIMIZEVACUUM 命令。 维护是自动进行的。

示例

-- Create a materialized view if it doesn't exist
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create and schedule a materialized view to be refreshed daily at midnight.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE CRON '0 0 0 * * ? *'
  AS SELECT date AS date, sum(sales) AS sumOfSales
       FROM table1
       GROUP BY date;

-- Create a materialized view with a column constraint
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
    member_id NOT NULL PRIMARY KEY,
    full_name,
    movie_title
  )
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create a materialized view with a table constraint
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
    member_id NOT NULL,
    full_name,
    movie_title,
    CONSTRAINT movie_pk PRIMARY KEY(member_id)
  )
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create a materialized view without column list
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
    CONSTRAINT movie_pk PRIMARY KEY(member_id)
  )
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;