全部產品
Search
文件中心

MaxCompute:物化視圖操作

更新時間:Dec 20, 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)的使用者。

列出專案下物化視圖

列出專案下所有的物化視圖,或符合某些規則的物化視圖。

具備專案查看對象列表許可權(List)的使用者。

刪除物化視圖

刪除已建立的物化視圖。

具備刪除表許可權(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 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屬性
    [REFRESH EVERY <num> MINUTES/HOURS/DAYS] 
    [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 BY

    指定物化視圖分區欄位,表示建立的物化視圖表為分區表。

    CLUSTERED BY|RANGE CLUSTERED BY

    用於建立聚簇表時設定表的Shuffle屬性。

    SORTED BY

    用於建立聚簇表時設定表的Sort屬性。

    REFRESH EVERY

    用於設定物化視圖定時更新間隔。單位可選擇:分鐘/小時/天。

    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 BY (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 BY (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");  
       
      CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_blank_pts PARTITIONED BY (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          |
      +------------+------------+------------+

更新物化視圖

當物化視圖的資料對應的表或分區產生插入、覆寫、更新、刪除等操作時,物化視圖會自動失效,無法用於查詢改寫。您可以先查看物化檢視狀態,當物化視圖失效時,執行更新操作。查看物化檢視狀態操作,請參見查詢物化視圖資訊

  • 注意事項

    • 物化視圖的更新操作只會更新源表有資料變化的表或者分區。

    • 您可以開啟物化視圖定時更新功能來定時更新資料。詳情請參見物化視圖定時更新

  • 命令格式

    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 BY (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");

列出專案下物化視圖

列出專案下所有的物化視圖,或符合某些規則的物化視圖。

說明

SHOW MATERIALIZED VIEWS命令需要在MaxCompute用戶端(odpscmd)0.43.0及以上版本中執行。

  • 命令格式

    --列出專案下所有的物化視圖。
    SHOW MATERIALIZED VIEWS;
    --列出專案下名稱與materialized_view匹配的物化視圖。
    SHOW MATERIALIZED VIEWS LIKE '<materialized_view>';
  • 使用樣本

    --列出專案下名稱與test*匹配的物化視圖名。*表示任意欄位。
    SHOW MATERIALIZED VIEWS LIKE 'test*';         

    返回結果如下。

    ALIYUN$account_name:test_two_mv
    ALIYUN$account_name:test_create_one_mv

刪除物化視圖

刪除已建立的物化視圖。

  • 命令格式

    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');

物化視圖查詢穿透

對於分區物化視圖,不一定所有分區都有資料,可能只重新整理了最新的一些分區資料。但使用者查詢資料時,實際並不知道查詢的所有分區資料是否都存在,當查詢的分區資料不存在時,需要自動實現到原始分區表去查詢資料,流程如下圖所示。

查詢透穿圖示

如果需要物化視圖支援穿透查詢能力,您需要設定如下參數:

建立物化視圖時,在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');
    
    --建立分區物化視圖支援穿透。
    CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 
    PARTITIONED BY (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不能保證讀取物化視圖一定比讀取源表節省費用。

相關文檔

關於物化視圖查詢改寫操作的相關內容,詳情請參見物化視圖查詢改寫

關於物化視圖定時更新功能的相關內容,詳情請參見物化視圖定時更新