すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:マテリアライズドビュー操作

最終更新日:Apr 24, 2025

マテリアライズドビューは、JOIN や AGGREGATE などの時間のかかるクエリの事前計算結果を格納するデータベースオブジェクトです。同じクエリを実行する場合、事前計算結果を直接再利用できます。これにより、クエリの速度が向上します。

背景情報

ビューは、仮想テーブルとしてアクセスできる保存されたクエリです。ビューをクエリするたびに、クエリ文はビューを定義するために使用された SQL 文に変換されます。マテリアライズドビューは、実際のデータを格納するためにストレージリソースを占有する特別な物理テーブルです。マテリアライズドビューの課金ルールについては、このトピックの課金ルールセクションをご参照ください。

マテリアライズドビューは、以下のクエリに適しています。

  • 固定モードで頻繁に実行されるクエリ

  • JOIN や AGGREGATE などの時間のかかる操作を含むクエリ

  • テーブル内のデータのごく一部のみを含むクエリ

次の表は、従来のクエリとマテリアライズドビューに基づくクエリを比較したものです。

比較項目

従来のクエリ

マテリアライズドビューに基づくクエリ

クエリ文

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) などの非決定性関数はサポートされていません。

説明

非決定性関数を使用する必要がある場合は、セッションレベルで set odps.sql.materialized.view.support.nondeterministic.function=true; コマンドを実行します。

クラスタリングまたはパーティショニングをサポートするマテリアライズドビューを作成する

マテリアライズドビューのシナリオのデータに基づいて、クラスタリングまたはパーティショニングをサポートするマテリアライズドビューを作成できます。

  • 制限

    • 作成するマテリアライズドビューの名前は、現在のプロジェクト内の既存のテーブル、ビュー、またはマテリアライズドビューの名前と同じにすることはできません。SHOW TABLES; コマンドを実行して、プロジェクト内のすべてのテーブルとマテリアライズドビューの名前を表示できます。

    • 既存のマテリアライズドビューに基づいてマテリアライズドビューを作成することはできません。

    • 外部テーブルに基づいてマテリアライズドビューを作成することはできません。

  • 注意事項

    • マテリアライズドビューを作成する基になるクエリ文が実行に失敗した場合、マテリアライズドビューを作成できません。

    • マテリアライズドビューのパーティションキー列は、ソーステーブルから派生する必要があります。マテリアライズドビューの列の順序と数は、ソーステーブルの列の順序と数と同じである必要があります。列名は異なっていても構いません。

    • パーティションキー列を含むすべての列にコメントを指定する必要があります。一部の列のみにコメントを指定すると、エラーが返されます。

    • マテリアライズドビューにパーティショニング属性とクラスタリング属性の両方を指定できます。この場合、各パーティションのデータには、指定されたクラスタリング属性があります。

    • マテリアライズドビューを作成する基になるクエリ文に、マテリアライズドビューでサポートされていない演算子が含まれている場合、エラーが返されます。マテリアライズドビューでサポートされている演算子の詳細については、マテリアライズドビューのクエリと書き換えをご参照ください。

    • デフォルトでは、MaxCompute では、UDF や UDAF などの非決定性関数を使用してマテリアライズドビューを作成することはできません。非決定性関数を使用する必要がある場合は、セッションレベルで 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]    -- マテリアライズドビューのシャッフルおよびソート属性。クラスター化されたマテリアライズドビューを作成する場合は、このパラメーターが必要です。
    [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 コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで 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

    いいえ

    作成するマテリアライズドビューのシャッフル属性。クラスター化されたマテリアライズドビューを作成する場合は、clustered by または range clustered by パラメーターを指定する必要があります。

    SORTED BY

    いいえ

    作成するマテリアライズドビューのソート属性。クラスター化されたマテリアライズドビューを作成する場合は、このパラメーターを設定する必要があります。

    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 文。SELECT 文の構文の詳細については、SELECT 構文をご参照ください。

    • 例 1: マテリアライズドビューを作成します。

      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';
    • 例 2: ソーステーブルに空のパーティションが含まれているマテリアライズドビューを更新します。マテリアライズドビューに空のパーティションが生成されます。

      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 を含む ALTER 文を実行すると、マテリアライズドビューに空のパーティションが生成されます。
      ds=1
      ds=2
      
      SELECT * FROM mf_mv_blank_pts WHERE ds>0; 
      -- 返された結果から、ds=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 コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。

    mv_name

    はい

    更新するマテリアライズドビューの名前。

    ds

    いいえ

    マテリアライズドビューのパーティションフィールドの名前。

    max_pt

    いいえ

    table_name で指定されたテーブルまたはマテリアライズドビューの最大パーティション値。

    expression

    いいえ

    更新するパーティションを指定するために使用される式。パーティション化されたマテリアライズドビューを更新する場合は、このパラメーターを設定する必要があります。

    • 例 1: パーティション化されていないマテリアライズドビューを更新します。

      -- パーティション化されていないテーブルを作成します。
      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; 
    • 例 2: パーティション化されたマテリアライズドビューのパーティションを更新します。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds='1');
    • 例 3: パーティション化されたマテリアライズドビューのパーティションを更新します。パーティションは指定された条件を満たします。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>='1', ds<='2');
    • 例 4: 最新のパーティションデータをパーティション化されたマテリアライズドビューに更新します。

      -- パーティションテーブルを作成します。
      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 コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで 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 コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。

    mv_name

    はい

    ライフサイクル機能を有効または無効にするマテリアライズドビューの名前。

    pt_spec

    いいえ

    ライフサイクル機能を有効または無効にするマテリアライズドビューのパーティション情報。形式: (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)partition_col はパーティションフィールド名を示します。partition_col_value はパーティション値を示します。

    enable|disable

    はい

    enable オプションは、マテリアライズドビューまたはマテリアライズドビューのパーティションのライフサイクル機能を有効にすることを指定します。disable オプションは、マテリアライズドビューまたはマテリアライズドビューのパーティションのライフサイクル機能を無効にすることを指定します。ライフサイクル機能を無効にすると、マテリアライズドビューまたはパーティションのライフサイクル管理は不要になります。

    • 例 1: マテリアライズドビューのライフサイクル機能を有効にします。

      ALTER MATERIALIZED VIEW mf_mv_blank_pts  PARTITION (ds='1') enable LIFECYCLE;
    • 例 2: マテリアライズドビューのライフサイクル機能を無効にします。

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

マテリアライズドビューに関する情報をクエリする

マテリアライズドビューのスキーマや変更時刻など、マテリアライズドビューに関する情報をクエリできます。

  • 構文

    DESC EXTENDED [<project_name>.]<mv_name>;
  • 次の表は、コードのパラメーターについて説明しています。

    パラメーター

    必須

    説明

    project_name

    いいえ

    マテリアライズドビューが属する MaxCompute プロジェクトの名前。このパラメーターを設定しない場合、現在の MaxCompute プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。MaxCompute コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。

    mv_name

    はい

    クエリするマテリアライズドビューの名前。

  • DESC EXTENDED mv;

    次のコードは、クエリの結果例を示しています。

    説明

    次の結果例は、MaxCompute クライアントのバージョンが V0.43 以降の場合にのみ返されます。詳細については、MaxCompute クライアント (odpscmd) の「バージョンの更新」セクションをご参照ください。

    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$$****@***.aliyunid.com                       |
    | Project:                  m****                                                |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2023-05-30 13:16:07                                      |
    | LastDDLTime:              2023-05-30 13:16:07                                      |
    | LastModifiedTime:         2023-05-30 13:16:07                                      |
    +------------------------------------------------------------------------------------+
    | MaterializedView: YES                                                              |
    | ViewText: select id,name from mf_refresh                                           |
    | Rewrite Enabled: true                                                              |
    | AutoRefresh Enabled: true                                                          |
    | Refresh Interval Minutes: 10                                                       |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | bigint |       |               | true     | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Extended Info:                                                                     |
    +------------------------------------------------------------------------------------+
    | IsOutdated:               false                                                    |
    | TableID:                  569ec712873e44b3868e79b7a8beabab                         |
    | IsArchived:               false                                                    |
    | PhysicalSize:             1875                                                     |
    | FileNum:                  2                                                        |
    | StoredAs:                 CFile                                                    |
    | CompressionStrategy:      normal                                                   |
    | odps.timemachine.retention.days: 1                                                        |
    | ColdStorageStatus:        N/A                                                      |
    | encryption_enable:        false                                                    |
    +------------------------------------------------------------------------------------+
    | AutoRefresh History:                                                               |
    +------------------------------------------------------------------------------------+
    | InstanceId                | Status     | StartTime           | EndTime             |
    +------------------------------------------------------------------------------------+
    | 20230619070546735ghwl1****** | TERMINATED | 2023-06-19 15:05:46 | 2023-06-19 15:05:47 |
    | 20230619065545586gwllc****** | TERMINATED | 2023-06-19 14:55:45 | 2023-06-19 14:55:46 |
    | 20230619064544463gcjgom****** | TERMINATED | 2023-06-19 14:45:44 | 2023-06-19 14:45:45 |
    | 20230619063543334gzxs2d****** | TERMINATED | 2023-06-19 14:35:43 | 2023-06-19 14:35:44 |
    | 2023061906254257gi21w2****** | TERMINATED | 2023-06-19 14:25:42 | 2023-06-19 14:25:43 |
    | 20230619061540813giacg8****** | TERMINATED | 2023-06-19 14:15:41 | 2023-06-19 14:15:41 |
    | 20230619060539674gswjq9****** | TERMINATED | 2023-06-19 14:05:39 | 2023-06-19 14:05:40 |
    | 20230619055538578gvdjk****** | TERMINATED | 2023-06-19 13:55:38 | 2023-06-19 13:55:40 |
    | 20230619054537356glqdne****** | TERMINATED | 2023-06-19 13:45:37 | 2023-06-19 13:45:38 |
    | 2023061905353687gcc5pl****** | TERMINATED | 2023-06-19 13:35:36 | 2023-06-19 13:35:37 |
    +------------------------------------------------------------------------------------+

マテリアライズドビューのステータスをクエリする

マテリアライズドビューのステータスをクエリできます。この操作により、ソーステーブルへの変更を表示し、マテリアライズドビューが有効かどうかを判断できます。マテリアライズドビューは、次のいずれかの状態になります。

  • 有効

    クエリ文を実行すると、MaxCompute はソーステーブルからデータをクエリする代わりに、マテリアライズドビューからデータをクエリします。

  • 無効

    クエリ文を実行すると、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 コマンドには、バージョン 0.43.0 以降の MaxCompute クライアント (odpscmd) が必要です。

  • 構文

    --プロジェクト内のすべてのマテリアライズドビューを一覧表示します。
    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 コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。

    mv_name

    はい

    削除するマテリアライズドビューの名前。

    purge

    いいえ

    purge パラメーターを指定すると、マテリアライズドビューを削除するときにマテリアライズドビューのデータが削除されます。

    • mv マテリアライズドビューを削除します。

      DROP MATERIALIZED VIEW count_mv;
    • mv マテリアライズドビューを削除し、同時にマテリアライズドビューのデータを削除します。

      DROP MATERIALIZED VIEW count_mv purge;

既存のマテリアライズドビューからパーティションを削除する

既存のマテリアライズドビューから 1 つ以上のパーティションを削除できます。

  • 構文

    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 コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。

    mv_name

    はい

    パーティションを削除するパーティション化されたマテリアライズドビューの名前。

    IF EXISTS

    いいえ

    IF EXISTS を指定せず、マテリアライズドビューが存在しない場合、エラーが返されます。

    pt_spec

    はい

    削除するパーティション。少なくとも 1 つのパーティションを指定する必要があります。形式: (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)partition_col はパーティションフィールド名を示します。partition_col_value はパーティション値を示します。

    • 例 1: パーティション化されたマテリアライズドビューからパーティションを削除します。サンプル文:

      ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds='1');
    • 例 2: 特定の条件を満たすパーティションをパーティション化されたマテリアライズドビューから削除します。サンプル文:

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

マテリアライズドビューでペネトレーションクエリを実行する

パーティション化されたマテリアライズドビューには、最新のパーティションデータのみがパーティション化されたマテリアライズドビューに更新される場合、ソースのパーティションテーブルのすべてのパーティションのデータは含まれません。クエリするパーティションデータがパーティション化されたマテリアライズドビューに存在しない場合、システムはペネトレーションクエリを実行して、ソースのパーティションテーブルからデータをクエリします。次の図は、ペネトレーションクエリを実行する方法を示しています。

查询透穿图示

マテリアライズドビューがペネトレーションクエリをサポートできるようにするには、次のパラメーターを設定する必要があります。

マテリアライズドビューを作成するときに、"enable_auto_substitute"="true"tblproperties に追加します。

次の例は、マテリアライズドビューに基づいてペネトレーションクエリを実行する方法を示しています。

  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. mv マテリアライズドビューから src テーブルの 20210101 パーティションのデータをクエリします。

    SELECT * FROM mv WHERE dt='20210101';
  3. mv マテリアライズドビューから src テーブルの 20210102 パーティションのデータをクエリします。mv マテリアライズドビューにはパーティションデータが含まれていません。したがって、ペネトレーションクエリが実行され、src テーブルからパーティションデータがクエリされます。

    SELECT * FROM mv WHERE dt = '20210102';
    -- mv マテリアライズドビューには 20210102 パーティションのデータが含まれておらず、src テーブルからパーティションデータをクエリする必要があるため、前の文は次の文と同じです。
    SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;
  4. mv マテリアライズドビューから 20201230 から 20210102 までのパーティションのデータをクエリします。mv マテリアライズドビューにはすべてのパーティションデータが含まれていません。したがって、ペネトレーションクエリが実行され、mv マテリアライズドビューに含まれていないデータが取得され、取得されたデータと mv マテリアライズドビューからクエリされたデータに対して UNION 操作が実行されて、最終結果が返されます。

    SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id='5'; 
    -- mv マテリアライズドビューには 20210102 パーティションのデータが含まれておらず、ペネトレーションクエリが実行され、ソーステーブルから 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 は、マテリアライズドビューからのデータ読み取りのコストがソーステーブルからのデータ読み取りのコストよりも少ないことを保証できません。

参考資料

共通クエリをマテリアライズドビューからのクエリに書き換える方法の詳細については、マテリアライズドビューのクエリと書き換え をご参照ください。

マテリアライズドビューのスケジュールされた更新機能の詳細については、マテリアライズドビューのスケジュールされた更新 をご参照ください。