全部产品
Search
文档中心

云原生大数据计算服务 MaxCompute:物化视图操作

更新时间:Dec 06, 2024

物化视图(Materialized View)是一种预先计算的方式,通过保存某些耗时操作(例如JOIN、AGGREGATE)的结果,以便在查询时直接复用,从而避免重复执行这些耗时操作,最终实现加速查询的目的。

背景信息

视图是一种虚拟表,任何对视图的查询,都会转换为视图SQL语句的查询。而物化视图是一种特殊的物理表,物化视图会存储实际的数据,占用存储资源。更多物化视图计费信息,请参见计费规则

物化视图适用于如下场景:

  • 模式固定、且执行频次高的查询。

  • 查询包含非常耗时的操作,比如聚合、连接操作等。

  • 查询仅涉及表中的很小部分数据。

物化视图与传统查询的对比如下。

对比项

传统查询方式

物化视图查询方式

查询语句

直接使用SQL语句查询数据。

SELECT empid,deptname  
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2018-01-01';

您需要创建物化视图,然后基于物化视图查询数据。

创建物化视图语句如下:

CREATE MATERIALIZED VIEW mv 
AS SELECT empid,deptname, hire_date  
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2016-01-01';

基于创建的物化视图查询数据:

SELECT empid, deptname FROM mv 
WHERE hire_date >= '2018-01-01';

如果物化视图开启了查询改写功能,使用如下SQL语句查询数据时会直接从物化视图中查询数据:

SELECT empid,deptname 
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2018-01-01';
--相当于如下语句。
SELECT empid, deptname FROM mv 
WHERE hire_date >= '2018-01-01';

查询特点

查询涉及读表、JOIN、过滤(WHERE)操作。当源表数据量很大时,查询速度会很慢。操作复杂度较高,运行效率低。

查询涉及读表、过滤操作。不涉及JOIN操作。MaxCompute会自动匹配到最优物化视图,并直接从物化视图中读取数据,从而大大提高查询效率。

物化视图相关操作命令如下。

类型

功能

角色

操作入口

创建物化视图(支持分区和聚簇)

基于查询语句创建物化视图。

具备项目创建表权限(CreateTable)的用户。

本文中的命令您可以在如下工具平台执行:

更新物化视图

更新已创建的物化视图。

具备修改表权限(Alter)的用户。

修改物化视图的生命周期

修改已创建的物化视图的生命周期。

具备修改表权限(Alter)的用户。

开启或禁用物化视图的生命周期

开启或禁用已创建的物化视图的生命周期。

具备修改表权限(Alter)的用户。

查询物化视图信息

查询物化视图的基本信息。

具备读取表元信息权限(Describe)的用户。

查询物化视图状态

查看物化视图有效或无效。

具备读取表元信息权限(Describe)的用户。

删除物化视图

删除已创建的物化视图。

具备删除表权限(Drop)的用户。

删除物化视图分区

删除已创建的物化视图的分区。

具备删除表权限(Drop)的用户。

物化视图查询穿透

当查询的分区数据不存在时,需要自动实现到原始分区表查询数据。

具备项目写权限(Write)及创建表权限(CreateTable)的用户。

物化视图查询改写

对查询语句进行查询改写。

具备项目写权限(Write)及创建表权限(CreateTable)的用户。

物化视图定时更新

定时更新已创建物化视图的数据。

具备修改表权限(Alter)的用户。

使用限制

物化视图的使用限制如下:

  • 不支持窗口函数。

  • 不支持UDTF函数。

  • 默认不支持非确定性函数(例如UDF、UDAF等)。当您的业务场景必须要使用非确定性函数时,请在Session级别设置属性set odps.sql.materialized.view.support.nondeterministic.function=true;

创建物化视图(支持分区和聚簇)

基于满足物化视图场景的数据创建物化视图,支持分区和聚簇场景。

  • 使用限制

    • 物化视图的名称不允许和当前项目中的已有表、视图、物化视图名称重复。您可以通过show tables;命令查看项目中的全部表及物化视图名称。

    • 不支持基于存在的物化视图创建新的物化视图。

    • 不支持基于外部表创建物化视图。

  • 注意事项

    • 当查询语句执行失败时,物化视图也会创建失败。

    • 物化视图分区列必须来源于某张源表,其顺序和列数目必须和源表一样,列名称可以不一样。

    • 列注释需要指定所有列,包含分区列。如果只指定部分列,会报错。

    • 可以同时指定分区和聚簇,此时每个分区中的数据都有指定的聚簇属性。

    • 当查询语句中包含不支持的算子时会报错。物化视图支持的算子列表,请参见物化视图查询改写操作

    • MaxCompute默认不支持使用非确定性函数(例如UDF、UDAF等)创建物化视图。当您的业务场景必须要使用非确定性函数时,请在Session级别设置属性set odps.sql.materialized.view.support.nondeterministic.function=true;

    • 物化视图支持生成空分区,原始表分区为空的时候,刷新物化视图,自动生成空分区。

  • 命令格式

    CREATE MATERIALIZED VIEW [IF NOT EXISTS][project_name.]<mv_name>
    [LIFECYCLE <days>]    --指定生命周期
    [BUILD DEFERRED]    -- 指定是在创建时只生成表结构,不生成数据
    [(<col_name> [COMMENT <col_comment>],...)]    --列注释
    [DISABLE REWRITE]    --指定是否用于改写
    [COMMENT 'table comment']    --表注释
    [PARTITIONED ON/BY (<col_name> [, <col_name>, ...])    --创建物化视图表为分区表
    [CLUSTERED BY|RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
         [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
                     INTO <number_of_buckets> BUCKETS]    --用于创建聚簇表时设置表的Shuffle和Sort属性
    [TBLPROPERTIES("compressionstrategy"="normal/high/extreme",    --指定表数据存储压缩策略
                    "enable_auto_substitute"="true",    --指定当分区不存在时是否转化视图来查询
                    "enable_auto_refresh"="true",    --指定是否开启自动刷新
                    "refresh_interval_minutes"="120",    --指定刷新时间间隔
                    "only_refresh_max_pt"="true"    --针对分区物化视图,只自动刷新源表最新分区
                    )]
    AS <select_statement>;
  • 参数说明

    参数

    是否必填

    参数说明

    IF NOT EXISTS

    如果没有指定IF NOT EXISTS且物化视图已经存在会返回报错。

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页面查看到具体的MaxCompute项目名称。

    mv_name

    新建物化视图的名称。

    days

    指定物化视图的生命周期,单位为天。取值范围为1~37231。

    BUILD DEFERRED

    如果加上这个关键字代表创建物化视图时,只生成表结构,不刷新数据。

    col_name

    指定物化视图的列名称。

    col_comment

    指定物化视图的列的注释。

    DISABLE REWRITE

    设置禁止通过物化视图执行查询改写操作。不指定时表示允许通过物化视图执行查询改写操作,您可以执行ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE;命令禁止通过物化视图执行查询改写操作。同理您可以执行ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE;命令允许通过物化视图执行查询改写操作。

    PARTITIONED ON

    指定物化视图分区字段,表示创建的物化视图表为分区表。

    CLUSTERED BY|RANGE CLUSTERED BY

    用于创建聚簇表时设置表的Shuffle属性。

    SORTED BY

    用于创建聚簇表时设置表的Sort属性。

    number_of_buckets

    用于创建聚簇表时设置表分桶数。

    TBLPROPERTIES

    • compressionstrategy指定表数据的存储压缩策略,可以选normal、high或extreme。enable_auto_substitute指定当分区不存在时是否自动穿透到原始分区表去查询数据,详细信息请参见物化视图查询改写

    • enable_auto_refresh:可选,当需要自动刷新数据时需要设置为true

    • refresh_interval_minutes:条件可选,当enable_auto_refreshtrue时,需要配置刷新间隔时间,单位为分钟。

    • only_refresh_max_pt:可选,只适用于带分区的物化视图,但设置为true时,只会刷新源表最新分区。

    select_statement

    查询语句,详细格式请参见SELECT语法

  • 使用示例

    • 示例一:创建物化视图。

      1. 创建mf_tmf_t1两张表并插入数据。

        CREATE TABLE IF NOT EXISTS mf_t( 
             id     bigint, 
             value   bigint, 
             name   string) 
        PARTITIONED BY (ds STRING); 
        
        ALTER TABLE mf_t ADD PARTITION (ds='1'); 
        INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'kyle'),(2,20,'xia'); 
        SELECT * FROM mf_t WHERE ds ='1'; 
        -- 返回结果如下。
        +------------+------------+------------+------------+
        | id         | value      | name       | ds         |
        +------------+------------+------------+------------+
        | 1          | 10         | kyle       | 1          |
        | 2          | 20         | xia        | 1          |
        +------------+------------+------------+------------+
        
        CREATE TABLE IF NOT EXISTS mf_t1( 
             id     bigint, 
             value   bigint, 
             name   string) 
        PARTITIONED BY (ds STRING); 
        
        ALTER TABLE mf_t1 ADD PARTITION (ds='1'); 
        INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'kyle'),(3,20,'john'); 
        SELECT * FROM mf_t1 WHERE ds ='1';
        -- 返回结果如下。
        +------------+------------+------------+------------+
        | id         | value      | name       | ds         |
        +------------+------------+------------+------------+
        | 1          | 10         | kyle       | 1          |
        | 3          | 20         | john       | 1          |
        +------------+------------+------------+------------+
      2. 创建物化视图。

        • 示例1:创建以ds为分区列的物化视图。

          CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7
          (
            key comment 'unique id',
            value comment 'input value',
            ds comment 'partitiion'
            )
          PARTITIONED ON (ds)
          AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds
               FROM mf_t AS t1 JOIN mf_t1 AS t2
                 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
          --查询物化视图
          SELECT * FROM mf_mv WHERE ds =1;
          +------------+------------+------------+
          | key        | value      | ds         |
          +------------+------------+------------+
          | 1          | 10         | 1          |
          +------------+------------+------------+
        • 示例2:创建带有聚簇属性的非分区物化视图。

          CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7 
          CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets 
          AS  SELECT t1.id AS key, t1.value AS value, t1.ds AS ds 
                FROM mf_t AS t1 JOIN mf_t1 AS t2 
                  ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
        • 示例3:创建带有聚簇属性的分区物化视图。

          CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7 
          PARTITIONED ON (ds) 
          CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets 
          AS  SELECT t1.id AS key, t1.value AS value, t1.ds AS ds 
                FROM mf_t AS t1 JOIN mf_t1 AS t2 
                  ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
    • 示例二:原始表分区为空的时候,刷新物化视图,自动生成空分区。

      CREATE TABLE mf_blank_pts(id bigint ,name string) PARTITIONED BY (ds bigint); 
      ALTER TABLE mf_blank_pts ADD PARTITION (ds = 1); 
      ALTER TABLE mf_blank_pts ADD PARTITION (ds = 2); 
      INSERT INTO TABLE mf_blank_pts PARTITION(ds=1) VALUES (1,"aba"),(2,"cbd");  
      
      -- 初始化分区数据
      SET odps.sql.materialized.view.initial.partition={"ds": 1}; 
      CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_blank_pts PARTITIONED ON (ds) 
      AS SELECT id,name,ds FROM mf_blank_pts;
      
      ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>0); 
      
      SHOW PARTITIONS mf_mv_blank_pts; 
      --原表分区ds=2是没有值,当刷新ds>0分区时,物化视图里有了空分区
      ds=1
      ds=2
      
      SELECT * FROM mf_mv_blank_pts WHERE ds>0; 
      --返回只有分区1有值
      +------------+------------+------------+
      | id         | name       | ds         |
      +------------+------------+------------+
      | 1          | aba        | 1          |
      | 2          | cbd        | 1          |
      +------------+------------+------------+

更新物化视图

当物化视图的数据对应的表或分区产生插入、覆写、更新、删除等操作时,物化视图会自动失效,无法用于查询改写。您可以先查看物化视图状态,当物化视图失效时,执行更新操作。查看物化视图状态操作,请参见查询物化视图信息

  • 注意事项

    • 物化视图的更新操作只会更新源表有数据变化的表或者分区。

    • 您可以借助于DataWorks调度能力实现定时更新。DataWorks的调度操作信息,请参见调度配置

  • 命令格式

    ALTER MATERIALIZED VIEW [<project_name>.]<mv_name>
          REBUILD [PARTITION (<ds>=max_pt(<table_name>),<expression1>...)];
  • 参数说明

    参数

    是否必填

    参数说明

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签查看到具体的MaxCompute项目名称。

    mv_name

    待更新物化视图的名称。

    ds

    物化视图分区字段名称。

    max_pt

    取指定表或者物化视图(table_name)的最大分区值。

    expression

    当更新分区物化视图时,需要指定待更新分区信息,支持表达式。

  • 使用示例

    • 示例一:更新非分区物化视图。

      -- 创建非分区表
      CREATE TABLE count_test(a BIGINT, b BIGINT); 
      --创建非分区物化视图
      CREATE MATERIALIZED VIEW count_mv LIFECYCLE 7 AS SELECT COUNT(*) FROM count_test; 
      --更新非分区物化视图 
      ALTER MATERIALIZED VIEW count_mv rebuild; 
    • 示例二:更新分区物化视图的某个分区。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds='1');
    • 示例三:更新分区物化视图的满足指定条件的分区。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>='1', ds<='2');
    • 示例四:更新分区物化视图的最新分区数据。

      -- 创建示例分区表
      CREATE TABLE IF NOT EXISTS sale_detail_jt 
      (shop_name STRING , 
      customer_id STRING , 
      total_price DOUBLE ) 
      PARTITIONED BY (sale_date STRING ,region STRING );
      
      ALTER TABLE  sale_detail_jt ADD PARTITION (sale_date='2013',region='china');
      
      INSERT INTO  sale_detail_jt PARTITION (sale_date='2013',region='china') VALUES 
          ('s1','c1',100.1), 
          ('s2','c2',100.2), 
          ('s3','c3',100.3);
      
      ALTER TABLE  sale_detail_jt ADD PARTITION (sale_date='2013',region='en');
      INSERT INTO  sale_detail_jt PARTITION (sale_date='2013',region='en') VALUES 
          ('t1','c5',200.0), 
          ('t2','c6',300.0);
          
      --查看分区数据
      SELECT * FROM sale_detail_jt WHERE sale_date='2013' AND region='china';
      +-----------+-------------+-------------+-----------+--------+
      | shop_name | customer_id | total_price | sale_date | region |
      +-----------+-------------+-------------+-----------+--------+
      | s1        | c1          | 100.1       | 2013      | china  |
      | s2        | c2          | 100.2       | 2013      | china  |
      | s5        | c2          | 100.2       | 2013      | china  |
      +-----------+-------------+-------------+-----------+--------+
      --查看分区数据
      SELECT * FROM sale_detail_jt WHERE sale_date='2013' AND region='en';
      +-----------+-------------+-------------+-----------+--------+
      | shop_name | customer_id | total_price | sale_date | region |
      +-----------+-------------+-------------+-----------+--------+
      | t1        | c5          | 200.0       | 2013      | en     |
      | t2        | c6          | 300.0       | 2013      | en     |
      +-----------+-------------+-------------+-----------+--------+
      
      --创建物化视图
      CREATE MATERIALIZED VIEW mv_deferred BUILD DEFERRED AS SELECT * FROM sale_detail_jt;
      
      --查询物化视图 mv_deferred;
      SELECT * FROM mv_deferred;
      --返回
      +-----------+-------------+-------------+-----------+--------+
      | shop_name | customer_id | total_price | sale_date | region |
      +-----------+-------------+-------------+-----------+--------+
      +-----------+-------------+-------------+-----------+--------+
      
      --创建分区表
      CREATE TABLE mf_part (id bigint,name string) PARTITIONED BY (dt string);
      --插入数据
      INSERT INTO mf_part PARTITION(dt='2013') VALUES(1,'name1'),(2,'name2');
      --查询数据
      SELECT * FROM mf_part WHERE dt='2013';
      --返回:
      +------------+------+----+
      | id         | name | dt |
      +------------+------+----+
      | 1          | name1 | 2013 |
      | 2          | name2 | 2013 |
      +------------+------+----+
      
      --创建带分区的物化视图
      CREATE MATERIALIZED VIEW mv_rebuild BUILD DEFERRED PARTITIONED ON (dt) AS SELECT * FROM mf_part;
      
      --查询物化视图数据
      SELECT * FROM mv_rebuild WHERE dt='2013';
      --返回
      +------------+------+----+
      | id         | name | dt |
      +------------+------+----+
      +------------+------+----+
      --刷新最新分区数据
      ALTER MATERIALIZED VIEW mv_rebuild REBUILD PARTITION(dt=max_pt('mf_part'));
      
      --查询物化视图数据
      SELECT * FROM mv_rebuild WHERE dt='2013'; 
      --返回
      +------------+------+----+
      | id         | name | dt |
      +------------+------+----+
      | 1          | name1 | 2013 |
      | 2          | name2 | 2013 |
      +------------+------+----+

修改物化视图的生命周期

修改已创建的物化视图的生命周期。

  • 命令格式

    ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> SET LIFECYCLE <days>;
  • 参数说明

    参数

    是否必填

    参数说明

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签查看到具体的MaxCompute项目名称。

    mv_name

    待更新物化视图的名称。

    days

    设置物化视图的新生命周期。单位为天。

  • 使用示例

    --修改物化视图的生命周期为10天。
    ALTER MATERIALIZED VIEW count_mv SET LIFECYCLE 10;

开启或禁用物化视图的生命周期

开启或禁用已创建的物化视图的生命周期。

  • 命令格式

    ALTER MATERIALIZED VIEW  [<project_name>.]<mv_name> [<pt_spec>] enable|disable LIFECYCLE;
  • 参数说明

    参数

    是否必填

    参数说明

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签查看到具体的MaxCompute项目名称。

    mv_name

    待开启或禁用生命周期的物化视图的名称。

    pt_spec

    待开启或禁用生命周期的物化视图的分区。格式为(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)partition_col是分区字段,partition_col_value是分区值。

    enable|disable

    enable代表开启,disable代表禁用,禁用后该分区或表就不涉及生命周期管理。

  • 使用示例

    • 示例一:开启物化视图的生命周期管理。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts  PARTITION (ds='1') enable LIFECYCLE;
    • 示例二:禁用物化视图的生命周期管理。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts  PARTITION (ds='1') disable LIFECYCLE;

查询物化视图信息

查看物化视图的结构、修改时间等信息。

  • 命令格式

    DESC EXTENDED [<project_name>.]<mv_name>;
  • 参数说明

    参数

    是否必填

    参数说明

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签查看到具体的MaxCompute项目名称。

    mv_name

    待查询物化视图的名称。

  • 使用示例

    DESC EXTENDED mf_mv_blank_pts;

    返回结果如下:

    说明

    如下结果示例需要MaxCompute客户端升级至v0.43及以上版本,详情请参见使用本地客户端(odpscmd)连接

    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$$****@***.aliyunid.com                  |
    | Project:                  a****                                               |
    | Schema:                   default                                                  |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2024-12-06 10:21:40                                      |
    | LastDDLTime:              2024-12-06 10:42:19                                      |
    | LastModifiedTime:         2024-12-06 10:22:05                                      |
    +------------------------------------------------------------------------------------+
    | MaterializedView: YES                                                              |
    | ViewText: SELECT id,name,ds FROM mf_blank_pts                                      |
    | Rewrite Enabled: true                                                              |
    | AutoRefresh Enabled: false                                                         |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | bigint |       |               | true     | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | bigint     |                                                     |
    +------------------------------------------------------------------------------------+
    | Extended Info:                                                                     |
    +------------------------------------------------------------------------------------+
    | IsOutdated:               false                                                    |
    | TableID:                  f9bda66b9496412d923c6a6715e834b6                         |
    | IsArchived:               false                                                    |
    | PhysicalSize:             1581                                                     |
    | FileNum:                  1                                                        |
    | StoredAs:                 CFile                                                    |
    | CompressionStrategy:      normal                                                   |
    | odps.timemachine.retention.days: 1                                                        |
    | encryption_enable:        false                                                    |
    +------------------------------------------------------------------------------------+

查询物化视图状态

查询物化视图状态,以便及时知晓源表变更,确保物化视图有效。物化视图状态分为如下两种:

  • 物化视图有效

    执行查询语句时,MaxCompute会从物化视图中直接查询数据,不会从源数据中查询数据。

  • 物化视图无效

    执行查询语句时,MaxCompute无法从物化视图中直接查询数据,会从源数据中查询数据,无法实现查询加速。

用户可以通过下面的函数查看物化视图的数据是否有效。

  • 函数声明。

    Boolean materialized_view_is_valid(<mv_name>,<partition_value>);
  • 使用示例。

    检查mf_mv_refresh4的数据是否与原表最新的数据一致,如果一致返回true,否则返回false

    • SELECT materialized_view_is_valid("count_mv");
    • SELECT materialized_view_is_valid("mf_mv_blank_pts","1");

删除物化视图

删除已创建的物化视图。

  • 命令格式

    DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name> [purge];
  • 参数说明

    参数

    是否必填

    参数说明

    IF EXISTS

    如果没有指定IF EXISTS且物化视图不存在会返回报错。

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签查看到具体的MaxCompute项目名称。

    mv_name

    待删除物化视图的名称。

    purge

    指定purge在删除物化视图时,直接删除数据。

  • 使用示例

    • 删除物化视图mv

      DROP MATERIALIZED VIEW count_mv;
    • 删除物化视图mv的同时也删除数据。

      DROP MATERIALIZED VIEW count_mv purge;

删除物化视图分区

删除已创建的物化视图的单个或多个分区。

  • 命令格式

    ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> DROP [IF EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec>, PARTITION <pt_spec>....];
  • 参数说明

    参数

    是否必填

    参数说明

    project_name

    物化视图所属目标MaxCompute项目名称。不填写时表示当前所在MaxCompute项目。您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签查看到具体的MaxCompute项目名称。

    mv_name

    待删除分区的分区物化视图的名称。

    IF EXISTS

    如果没有指定IF EXISTS且物化视图不存在会返回报错。

    pt_spec

    至少要指定一个分区。待删除的分区。格式为(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)partition_col是分区字段,partition_col_value是分区值。

  • 使用示例

    • 示例一:删除分区物化视图的某个分区。命令示例如下。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds='1');
    • 示例二:删除分区物化视图的满足指定条件的分区。命令示例如下。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds>='1' AND ds<='2');

物化视图查询穿透

对于分区物化视图,不一定所有分区都有数据,可能只刷新了最新的一些分区数据。但用户查询数据时,实际并不知道查询的所有分区数据是否都存在,当查询的分区数据不存在时,需要自动实现到原始分区表去查询数据,流程如下图所示。

查询透穿图示

如果需要物化视图支持穿透查询能力,您需要设置如下参数:

  • 在Session级别设置set odps.optimizer.cbo.rule.filter.black=re;,分区列会被折叠成常量。

  • 创建物化视图时,在tblproperties属性中添加"enable_auto_substitute"="true"配置。

物化视图支持穿透查询示例如下。

  1. 创建物化视图支持分区并且支持查询穿透。

    -- 创建src表。
    CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string);
    -- 插入数据。
    INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex');
    INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink');
    
    --将分区列折叠为常量,实现分区动态可变。
    SET odps.optimizer.cbo.rule.filter.black=re;
    --初始化20210101分区数据。
    SET odps.sql.materialized.view.initial.partition={"dt": "20210101"};
    --创建分区物化视图支持穿透。
    CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 
    PARTITIONED ON (dt) 
    tblproperties("enable_auto_substitute"="true") 
    AS SELECT id, name, dt FROM src;
  2. 查询表src中的分区为20210101的数据。

    SELECT * FROM mv WHERE dt='20210101';
  3. 查询物化视图mv中的分区为20210102的数据,自动穿透到源表查询数据。

    SELECT * FROM mv WHERE dt = '20210102';
    --因为20210102的数据没有物化,则需要把查询转化到对应的源表,等价于
    SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;
  4. 查询物化视图mv中分区为20201230~20210102的数据,自动穿透到源表查询的数据与物化视图的数据执行UNION操作后再返回结果。

    SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id='5'; 
    --因为20210102的数据没有物化,则需要把查询转化到对应的源表。等价于:
    SELECT * FROM
    (SELECT id, name, dt FROM src WHERE dt='20211231' OR dt='20210102'
     UNION ALL  
     SELECT * FROM mv WHERE dt='20210101'
    ) t WHERE id = '5';

计费规则

物化视图费用包含如下两部分:

  • 存储费用

    物化视图会占用物理存储空间,会产生存储费用,按量计费。更多计费信息,请参见存储费用(按量计费)

  • 计算费用

    创建、更新、查询物化视图及查询改写(物化视图有效)过程中涉及到查询数据,会消耗计算资源产生计算费用。

    • 当MaxCompute项目的规格类型为包年包月时,不单独收费。

    • 当MaxCompute项目的规格类型为按量计费时,按照SQL复杂度及输入数据量计算费用。更多计费信息,请参见SQL标准计费。您需要注意如下信息:

      • 更新物化视图执行的SQL与创建物化视图执行的SQL相同,如果该物化视图所在项目绑定的是预付费(包年包月)计算资源组,那么会使用已经购买的预付费资源,不会有额外费用;如果绑定的是后付费资源组,费用取决于执行SQL时输入的数据量和复杂度。同时刷新物化视图后会按照实际存储大小收取存储费用。

      • 当物化视图处于生效状态时查询改写会从物化视图中读取数据,查询语句的输入数据量(从物化视图读取部分)与物化视图相关,与物化视图源表无关。当物化视图处于失效状态时不支持查询改写,查询语句会直接查询源表,查询语句的输入数据量与源表相关。更多查询物化视图状态信息,请参见查询物化视图状态

      • 由于多表关联生成物化视图会产生数据膨胀等原因,从物化视图读取的数据量不一定绝对小于源表,MaxCompute不能保证读取物化视图一定比读取源表节省费用。

相关文档

关于物化视图查询改写操作的相关内容,详情请参见物化视图查询改写

关于物化视图定时更新功能的相关内容,详情请参见物化视图定时更新