创建物化视图

更新时间:

云原生数据仓库 AnalyticDB MySQL 版物化视图会将用户定义的查询提前计算好并将查询结果存储起来。在分析复杂查询时可以直接从物化视图中读取预先计算好的查询结果,从而加快查询响应时间。本文主要介绍如何创建物化视图。

权限要求

  • 创建视图需要有数据库或表级别的CREATE权限。

  • 刷新物化视图需要有数据库或表级别的INSERT权限。

  • 需要有物化视图所涉及的所有表的相关列(或整个表)的SELECT权限。

  • 如果在创建物化视图时指定物化视图为自动刷新模式,需要具备通过服务器本地(即127.0.0.1)或者任意IP(即'%')刷新视图的权限。

使用限制

  • 不支持对物化视图执行INSERTDELETEUPDATE操作。

  • 不支持删除或重命名物化视图的基表或基表中的列。如需修改基表需要先删除物化视图。

  • 默认情况下,一个AnalyticDB for MySQL集群支持创建的物化视图上限如下:

    • 集群版本低于3.1.4.7:最多支持创建8个物化视图。

    • 集群版本等于或大于3.1.4.7:最多支持创建64个物化视图。

    说明
    • 查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

    • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

语法

CREATE [OR REPLACE] MATERIALIZED VIEW <mv_name>
[MV DEFINITION]
[MV_PROPERTIES=<MV_PROPERTIES>]
[REFRESH [COMPLETE|FAST] [ON [DEMAND |OVERWRITE] [START WITH date] [NEXT date]]]
[QUERY REWRITE]
AS 
<QUERY BODY>;

参数说明

参数

说明

OR REPLACE

根据是否存在重名物化视图选择对应的规则来创建物化视图,具体规则如下:

  • 若不存在重名物化视图,则直接创建一个新视图。

  • 若存在重名物化视图,则先删除原有的重名物化视图,再重新创建。

说明

3.1.4.7及以上内核版本集群支持该参数。

  • 查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

  • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

mv_name

物化视图名称。

MV DEFINITION

定义物化视图中表相关的特性。

  • 物化视图使用一张普通的表结构来存储数据。创建物化视图时支持使用普通表定义中所有的参数,如分区键、分布键、索引和冷热数据存储策略等。创建物化视图时建议定义分区键和主键,以提高后续查询性能。关于创建普通表支持的参数说明,请参见CREATE TABLE

  • 物化视图和普通表一样,默认全列建立索引。为减少存储空间和写入I/O,如果不需要全列建立索引,您可以指定INDEX关键字对特定列建立索引。在物化视图中建索引的方式与普通表的语法一致,建索引的语句,请参见CREATE TABLE

  • 与创建表的语法一致,创建物化视图时也不支持定义查询中没有输出的列。

[REFRESH [COMPLETE|FAST]

定义物化视图的刷新模式。取值如下:

  • COMPLETE(默认):全量刷新。全量刷新的详细介绍,请参见全量刷新物化视图

  • FAST:增量刷新。增量刷新功能的使用限制等,请参见增量刷新物化视图

    说明

    3.1.9.0及以上版本支持单表增量刷新物化视图;3.2.0.0及以上版本支持多表增量刷新物化视图。更多内容,请参见增量刷新物化视图

    • 查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

    • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

ON [DEMAND |OVERWRITE]

刷新物化视图的条件。取值如下:

  • DEMAND(默认):按需刷新。即您可以在需要刷新物化视图时手动触发刷新,或根据刷新需求配置NEXT自动触发刷新。

  • OVERWRITE:物化视图的基表在执行INSERT OVERWRITE语句导致数据被覆盖后,刷新物化视图。适合通过Batchload批量导入数据的场景。

    说明

    配置ON OVERWRITE时,不能定义START WITHNEXT

START WITH

定义物化视图的首次刷新时间。选填参数,若不填,则默认首次刷新时间为当前时间点。

说明

支持使用时间函数,但只支持精确到秒,毫秒部分会被截断。更多关于刷新物化视图的详情,请参见全量刷新物化视图增量刷新物化视图

NEXT

定义物化视图的下次刷新时间。若需要设置自动刷新,NEXT参数必填。

QUERY REWRITE

是否开启查询改写功能。开启后查询可被自动改写到物化视图上,物化视图可以被当作缓存使用。取值如下:

  • DISABLE QUERY REWRITE(默认值):关闭当前物化视图的查询改写功能。

  • ENABLE QUERY REWRITE:开启当前物化视图的查询改写功能。

说明

3.1.4及以上内核版本集群支持开启该功能。如何查看集群版本,请参见查看版本

  • 查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

  • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

QUERY BODY

定义物化视图的查询主体,查询主体可以是表、逻辑视图或者物化视图。其中:

  • 需要为查询中输出的表达式列定义别名,建议使用具有实际意义的别名。例如(SUM(price) AS total_price),表示设置表达式列SUM(price)的别名为total_price

  • 物化视图查询所涉及的基表不可被删除,且基表中的列不可被删除或修改。

  • 支持使用WITH语法。

  • 增量刷新的物化视图QUERY BODY还需注意以下内容:

    • 增量刷新的物化视图QUERY BODY中,不允许出现非确定性的表达式作为条件,如:now()rand()等。

    • 聚合操作支持COUNT、SUM、MAX、MIN、AVG、APPROX_DISTINCTCOUNT(DISTINCT)函数。

      说明

      3.2.2.1及以上版本,支持MAX、MIN、AVG、APPROX_DISTINCTCOUNT(DISTINCT)函数。

    • 使用MAX、MIN、APPROX_DISTINCTCOUNT(DISTINCT)函数时,增量物化视图的基表只允许执行INSERT操作。基表在执行DELETE、UPDATE、REPLACE、INSERT ON DUPLICATE KEY UPDATE等会导致数据删除的操作时会报错,因此基表禁止执行这些操作。

    • COUNT(DISTINCT)仅支持INTEGER类型。

    • AVG不支持DECIMAL类型。

    • 聚合操作不支持HAVING关键字。

    • COUNT(DISTINCT)外,其余聚合操作均不支持DISTINCT关键字。

    • 不支持窗口函数。

    • 不支持排序操作。

    • 不支持 UNION、EXCEPT、INTERSECT等集合操作。

MV_PROPERTIES

创建弹性物化视图,需要配置MV_PROPERTIES。弹性物化视图指创建和刷新物化视图时使用Job型资源组动态拉起的资源,可以有效降低成本,但是刷新速度相较普通物化视图会有所降低。

创建弹性物化视图需满足以下条件:

  • 集群的产品系列为企业版、基础版或湖仓版

  • 集群内核版本需为3.1.9.3及以上版本。

MV_PROPERTIES属性包括mv_resource_groupmv_refresh_hints参数,格式为JSON。

  • mv_resource_group:指定弹性物化视图所使用的Job型资源组。若指定的Job型型资源组不存在,创建弹性物化视图时会报错。

  • mv_refresh_hints:弹性物化视图支持配置的参数。支持配置的参数详情,请参见配置参数

示例

  • 创建物化视图myview1,每五分钟刷新一次。

    CREATE MATERIALIZED VIEW myview1
    REFRESH NEXT now() + interval 5 minute
    AS
    SELECT count(*) as cnt FROM base;
  • 创建物化视图myview2,每周一凌晨2点刷新。

    CREATE MATERIALIZED VIEW myview2
    REFRESH 
     START WITH DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') 
     NEXT DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM base;
  • 创建物化视图myview3,每天凌晨2点刷新。

    CREATE MATERIALIZED VIEW myview3
    REFRESH 
     START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
     NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM base;
  • 创建物化视图myview4,每个月第一天凌晨2点刷新。

    CREATE MATERIALIZED VIEW myview4
    REFRESH NEXT DATE_FORMAT(last_day(now()) + interval 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM base;
  • 创建物化视图myview5,只刷新一次。

    CREATE MATERIALIZED VIEW myview5
    REFRESH START WITH now() + interval 1 day
    AS 
    SELECT count(*) as cnt FROM base;
  • 创建物化视图myview6,不自动刷新,完全依靠手动刷新。

    CREATE MATERIALIZED VIEW myview6 (
      PRIMARY KEY (id)
    ) DISTRIBUTED BY HASH (id)
    AS
    SELECT id, name FROM base;
  • 创建物化视图myview7,指定列建立索引,默认全部列建立索引。

    CREATE MATERIALIZED VIEW myview7 (
      INDEX (name),
      PRIMARY KEY (id)
    ) DISTRIBUTED BY HASH (id)
    AS
    SELECT id, name, age FROM base;
  • 创建物化视图myview8,指定分区键和注释。

    CREATE MATERIALIZED VIEW myview8 (
      name varchar(10),
      value double,
      KEY INDEX_ID(id) COMMENT 'id',
      CLUSTERED KEY INDEX(name, value),
      PRIMARY KEY(id)
    ) 
    DISTRIBUTED BY hash(id)
    PARTITION BY value(date_format(dat, "%Y%m%d")) LIFECYCLE 30
    COMMENT 'MATERIALIZED VIEW c'
    AS 
    SELECT * FROM base;
  • 创建弹性物化视图myview9,每天刷新一次,弹性资源组为my_job_rg_1。

    CREATE MATERIALIZED VIEW myview9
    MV_PROPERTIES='{
      "mv_resource_group":"my_job_rg_1",
      "mv_refresh_hints":{"query_priority":"HIGH"}
    }'
    REFRESH COMPLETE ON DEMAND
    START WITH now()
    NEXT now() + INTERVAL 1 DAY
    AS
    SELECT * FROM base;

相关文档