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

MaxCompute:CREATE MATERIALIZED VIEW

最終更新日:Jan 20, 2025

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

背景情報

ビューは、仮想テーブルとしてアクセス可能なストアドクエリです。 ビューをクエリするたびに、クエリ文は、ビューを定義するために使用される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';
-- The preceding statement is equivalent to the following statement: 
SELECT empid, deptname FROM mv 
WHERE hire_date >= '2018-01-01';

クエリ特性

クエリには、テーブルの読み取り、JOIN、およびフィルター (WHERE句) 操作が含まれます。 ソーステーブルに大量のデータが含まれている場合、クエリ速度は遅くなります。 クエリ操作は複雑であり、クエリ効率は低い。

クエリには、テーブルの読み取りとフィルター操作が含まれます。 JOIN操作は含まれません。 MaxComputeは、最適なマテリアライズドビューを自動的に照合し、最適なマテリアライズドビューからデータを読み取ります。 これにより、クエリの効率が大幅に向上します。

課金ルール

マテリアライズド・ビューを使用すると、次の項目に対して課金されます。

  • ストレージ

    マテリアライズドビューは物理ストレージスペースを占有します。 マテリアライズドビューによって占有されている物理ストレージスペースに対して課金されます。 ストレージ料金の詳細については、「ストレージ料金 (従量課金) 」をご参照ください。

  • コンピューティング

    マテリアライズドビューの作成、更新、クエリ、およびクエリの書き換え (マテリアライズドビューが有効な場合) に、データがクエリされます。 これらの操作はコンピューティングリソースを消費し、コンピューティングコストを発生します。

    • MaxComputeプロジェクトがサブスクリプション課金方法を使用している場合

      、余分なコンピューティングコストは発生しません。

    • MaxComputeプロジェクトで従量課金を使用している場合

      、料金はSQLの複雑さと入力データの量に基づいて計算されます。 課金の詳細については、「標準SQLジョブの課金」セクションを参照してください。 コンピューティング価格。 以下の事項にご注意ください。

      • マテリアライズド・ビューの更新に使用されるSQL文は、マテリアライズド・ビューの作成に使用されるSQL文と同じです。 マテリアライズドビューが属するプロジェクトがサブスクリプションリソースグループにバインドされている場合、購入したサブスクリプションリソースは使用され、追加料金は発生しません。 プロジェクトが従量課金制のリソースグループにバインドされている場合、料金は入力データの量とSQL文の複雑さによって異なります。 マテリアライズドビューを更新すると、使用されているストレージスペースに基づいてストレージ料金が課金されます。

      • マテリアライズド・ビューが有効である場合、クエリ書き換え操作が実行されると、マテリアライズド・ビューからデータが読み取られます。 クエリステートメントのマテリアライズドビューから読み取られる入力データの量は、マテリアライズドビューに関連しており、マテリアライズドビューのソーステーブルとは無関係である。 マテリアライズドビューが無効な場合、クエリの書き換え操作は実行できず、ソーステーブルからデータがクエリされます。 クエリステートメントの入力データの量は、ソーステーブルに関連しています。 マテリアライズドビューのステータスを照会する方法の詳細については、このトピックの「マテリアライズドビューのステータスの照会」をご参照ください。

      • 複数のテーブルの関連付けに基づいてマテリアライズドビューが生成されると、データ膨張が発生する可能性があります。 したがって、具体化されたビューによって読み取られるデータの量は、ソーステーブル内のデータの量よりも絶対に少なくない可能性があります。 MaxComputeでは、マテリアライズドビューからのデータ読み取りのコストがソーステーブルからのデータ読み取りよりも低くなるようにすることはできません。

制限事項

マテリアライズド・ビューを使用する前に、次の制限事項に注意してください。

  • ウィンドウ関数はサポートされていません。

  • ユーザー定義のテーブル値関数 (UDTF) はサポートされていません。

  • デフォルトでは、ユーザー定義スカラー関数 (UDF) やユーザー定義集計関数 (UDAF) などの非決定論的関数はサポートされていません。 非決定性関数を使用する必要がある場合は、セッションレベルでset odps.sql.materialized.view.support.nondeterministic.function=true; コマンドを実行します。

注意事項

  • マテリアライズドビューの作成に基づくクエリ文の実行に失敗した場合、マテリアライズドビューは作成できません。

  • マテリアライズドビューのパーティションキー列は、ソーステーブルから派生する必要があります。 マテリアライズドビューの列のシーケンスと数は、ソーステーブルの列のシーケンスと数と同じである必要があります。 列名は異なる場合があります。

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

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

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

  • デフォルトでは、MaxComputeでは、UDFやUDAFなどの非決定性関数を使用してマテリアライズドビューを作成することはできません。 ビジネス要件に基づいて非決定性関数を使用する必要がある場合は、セッションレベルでset odps.sql.materialized.view.support.nondeterministic.function=true; コマンドを実行します。

  • マテリアライズドビューのソーステーブルに空のパーティションが含まれている場合は、マテリアライズドビューを更新して、マテリアライズドビューに空のパーティションを生成できます。

構文

CREATE MATERIALIZED VIEW [IF NOT EXISTS][project_name.]<mv_name>
[LIFECYCLE <days>]    -- The lifecycle of the materialized view.
[BUILD DEFERRED]    -- Specifies that only the schema is created and no data is updated when you create the materialized view.
[(<col_name> [COMMENT <col_comment>],...)]    -- The column comments.
[DISABLE REWRITE] -- Specifies whether to disable the query rewrite operation that is performed based on the materialized view.
[COMMENT 'table comment']    -- The materialized view comments.
[PARTITIONED BY (<col_name> [, <col_name>, ...])    -- The partitions in the materialized view. This parameter is required when you create a partitioned materialized view.
[CLUSTERED BY|RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
     [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
                 INTO <number_of_buckets> BUCKETS]    -- The shuffle and sort attributes of the materialized view. This parameter is required when you create a clustered materialized view.
[REFRESH EVERY <num> MINUTES/HOURS/DAYS]
[TBLPROPERTIES("compressionstrategy"="normal/high/extreme",    -- The compression policy for data storage of the materialized view.
                "enable_auto_substitute"="true",    -- Specifies whether to query data from the source partitioned table if the partition data that you want to query is not contained in the materialized view.
                "enable_auto_refresh"="true",    -- Specifies whether to enable the scheduled update feature.
                "refresh_interval_minutes"="120",    -- The update interval.
                "only_refresh_max_pt"="true"    -- Specifies whether to automatically update the latest partition data in the source table to the materialized view.
                )]
AS <select_statement>;

パラメーター

パラメーター

必須 / 任意

説明

存在しない場合

非対象

[If not EXISTS] を指定せず、マテリアライズドビューが既に存在する場合、エラーが返されます。

project_name

非対象

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

mv_name

対象

作成するマテリアライズド・ビューの名前。

days

非対象

作成するマテリアライズド・ビューのライフサイクル。 単位:日 有効な値: 1 ~ 37231

ビルドDEFERRED

非対象

このキーワードを追加すると、スキーマのみが作成され、マテリアライズドビューの作成時にデータは更新されません。

col_name

非対象

作成するマテリアライズドビューの列の名前。

col_comment

非対象

作成するマテリアライズドビューの列のコメント。

無効な書き換え

非対象

このマテリアライズドビューに基づいて実行されるクエリの書き換え操作を無効にするかどうかを指定します。 このパラメーターを設定しない場合、この具体化されたビューに基づくクエリの書き換え操作は許可されます。 この場合、ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE; ステートメントを実行して、マテリアライズド・ビューに基づいて実行されるクエリの書き換え操作を無効にできます。 ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE; ステートメントを実行して、マテリアライズド・ビューに基づいて実行されるクエリの書き換え操作を有効にすることもできます。

参加者

非対象

作成するマテリアライズドビューのパーティションキー列。 パーティション分割されたマテリアライズドビューを作成する場合は、このパラメーターを設定する必要があります。

CLUSTERED BY | レンジCLUSTERED BY

非対象

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

によって歌われた

非対象

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

すべてリフレッシュ

非対象

マテリアライズドビューのスケジュール更新間隔を設定します。 利用可能な単位は、分、時間、または日です。

number_of_buckets

非対象

作成するマテリアライズド・ビュー内のバケットの数。 クラスター化されたマテリアライズドビューを作成する場合は、このパラメーターを指定する必要があります。

TBLPROPERTIES

非対象

  • compressionstrategyは、作成するマテリアライズドビューのデータストレージの圧縮ポリシーを指定します。 有効な値: normal、high、extreme。 enable_auto_substateは、マテリアライズドビューにデータのクエリ元のパーティションが含まれていない場合に、ソーステーブルからデータを自動的にクエリするかどうかを指定します。 詳細については、「マテリアライズドビューのクエリと書き換え」をご参照ください。

  • enable_auto_refresh: オプション。 システムでデータを自動的に更新する場合は、このパラメーターをtrueに設定します。

  • refresh_interval_minutes: 条件付きでオプションです。 enable_auto_refreshtrueに設定されている場合、このパラメーターを設定する必要があります。 単位:分

  • only_refresh_max_pt: オプション。 このパラメーターは、パーティション分割されたマテリアライズドビューに有効です。 このパラメーターをtrueに設定すると、ソーステーブルの最新のパーティションデータがマテリアライズドビューに更新されます。

select_statement

対象

SELECTステートメント。 SELECTステートメントの構文の詳細については、「SELECT構文」をご参照ください。

マテリアライズドビューの作成

  1. mf_tおよびmf_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'; 
    -- The following result is returned: 
    +------------+------------+------------+------------+
    | 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';
    -- The following result is returned: 
    +------------+------------+------------+------------+
    | 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';
      -- Query data from the created materialized view.
      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';

マテリアライズド・ビューに基づくクエリの書き換えの実装

各ユーザーのページID、ユーザーID、およびアクセス時間を記録するvisit_recordsという名前のページアクセステーブルがあります。 ユーザーは頻繁に異なるページのトラフィックを分析します。 visit_recordsの構造は次のとおりです。

+------------------------------------------------------------------------------------+
| Field           | Type       | Label | Comment                                     |
+------------------------------------------------------------------------------------+
| page_id         | string     |       |                                             |
| user_id         | string     |       |                                             |
| visit_time      | string     |       |                                             |
+------------------------------------------------------------------------------------+

分析を容易にするには、ページIDでグループ化し、ページごとの訪問数をカウントするvisit_recordsテーブルの具体化ビューを作成します。 次に、マテリアライズドビューに基づいてクエリ操作を実行します。

  1. 次のステートメントでマテリアライズド・ビューを作成します。

    CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;
  2. 次のようにクエリ文を実行します。

    SET odps.sql.materialized.view.enable.auto.rewriting=true; 
    SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

    このクエリを実行すると、MaxComputeはマテリアライズドビューcount_mvを自動的に照合し、そこから集計データを取得します。

  3. 次のコマンドを使用して、クエリ文がマテリアライズドビューと一致するかどうかを確認します。

    EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

    結果は次のとおりです。

    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        Data source: doc_test_dev.count_mv
        TS: doc_test_dev.count_mv
            FS: output: Screen
                schema:
                  page_id (string)
                  _c1 (bigint)
    
    
    OK

    結果のデータソースは、クエリがdoc_test_devプロジェクトのテーブルcount_mvから読み取り、マテリアライズドビューの有効性とクエリの書き換えが成功したことを確認することを示しています。

マテリアライズド・ビューに基づいてクエリの書き換え操作を実行する

マテリアライズド・ビューの最も重要な機能は、クエリ・ステートメントに対してクエリ書き換え操作を実行することです。 マテリアライズドビューに基づいてクエリ文に対してクエリ書き換え操作を実行するには、クエリ文の前にset odps.sql.materialized.view.enable.auto.rewriting=true; を追加する必要があります。 マテリアライズド・ビューが無効な場合、マテリアライズド・ビューをクエリの書き換え操作に使用することはできません。 この場合、データはソーステーブルからクエリされ、クエリ速度は高速化されません。

説明

デフォルトでは、MaxComputeプロジェクトは独自のマテリアライズドビューのみをクエリの書き換え操作に使用できます。 他のMaxComputeプロジェクトのマテリアライズドビューに基づいてクエリ文に対してクエリ書き換え操作を実行する必要がある場合は、クエリ文の前にset odps.sql. マテリアライズド. view.source.project.white.list=<project_name1 >,< project_name3>; を追加してMaxComputeプロジェクトを指定する必要があります。

次の表は、MaxComputeのマテリアライズドビューのクエリ書き換えでサポートされる演算子の種類と、他の製品との対応関係を示しています。

演算子タイプ

分類

MaxCompute

BigQuery

Amazon RedShift

ハイブ

フィルター

フルマッチ式

対応

対応

対応

対応

式の部分一致

対応

対応

対応

対応

AGGREGATE

シングルAGGREGATE

対応

対応

対応

対応

複数のAGGREGATE

非対応

非対応

非対応

非対応

JOIN

JOINタイプ

INNER JOIN

非対応

INNER JOIN

INNER JOIN

シングルJOIN

対応

非対応

対応

対応

複数の参加

対応

非対応

対応

対応

AGGREGATE + JOIN

-

対応

非対応

対応

対応

マテリアライズド・ビューに基づくクエリ書き換え操作では、クエリ文のデータをマテリアライズド・ビューから取得する必要があります。 データには、出力列、フィルター操作に必要な列、集計関数に必要な列、JOIN操作に必要な列が含まれます。 クエリステートメントで必要な列がマテリアライズドビューに含まれていない場合、または集計関数でサポートされていない場合は、マテリアライズドビューに基づいてクエリの書き換え操作を実行できません。

フィルター条件を使用したクエリステートメントの書き換え

  1. 次のステートメントでマテリアライズド・ビューを作成します。

    CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;
  2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリステートメントと書き換えられたクエリステートメントの比較を示しています。

    元のクエリ文

    書き換えられたクエリ文

    SELECT a,b FROM src WHERE a>5;
    SELECT a,b FROM mv;
    SELECT a, b FROM src WHERE a=10;
    SELECT a,b FROM mv WHERE a=10;
    SELECT a, b FROM src WHERE a=10 AND b=3;
    SELECT a,b FROM mv WHERE a=10 AND b=3;
    SELECT a, b FROM src WHERE a>3;
    (SELECT a,b FROM src WHERE a>3 AND a<=5) UNION (SELECT a,b FROM mv);
    SELECT a, b FROM src WHERE a=10 AND d=4;

    マテリアライズドビューに列dがないため、書き換えに失敗しました。

    SELECT d, e FROM src WHERE a=10;

    マテリアライズドビューに列dとeがないため、書き換えに失敗しました。

    SELECT a, b FROM src WHERE a=1;

    具体化されたビューにa=1のデータがないため、書き換えに失敗しました。

集計関数を使用したクエリステートメントの書き換え

  • マテリアライズド・ビューのSQL文とクエリ文が同じ集計キーを持つ場合、書き換えがサポートされます。 集約キーが異なる場合、SUMMIN、およびMAXのみがサポートされます。

    1. 次のステートメントでマテリアライズド・ビューを作成します。

      CREATE MATERIALIZED VIEW mv AS 
      SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;
    2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリステートメントと書き換えられたクエリステートメントの比較を示しています。

      元のクエリ文

      書き換えられたクエリ文

      SELECT a, sum(c) FROM src GROUP BY a;
      SELECT a, sum(sum) FROM mv GROUP BY a;
      SELECT a, count(d) FROM src GROUP BY a, b;
      SELECT a, cnt FROM mv;
      SELECT a, count(b) FROM 
      (SELECT a, b FROM src GROUP BY a, b) GROUP BY a;
      SELECT a,count(b) FROM mv GROUP BY a;
      SELECT a,count(b) FROM mv GROUP BY a;

      ビューはすでに列aとbで集計を実行しており、bを再度集計できないため、書き換えに失敗しました。

      SELECT a, count(c) FROM src GROUP BY a;

      COUNT機能で再集計がサポートされていないため、書き換えに失敗しました。

  • 集計関数にDISTINCTが含まれている場合、マテリアライズドビューのSQLステートメントとクエリステートメントが同じ集計キーを持つ場合、書き換えがサポートされます。 それ以外の場合、書き換えはサポートされません。

    1. 次のステートメントでマテリアライズド・ビューを作成します。

      CREATE MATERIALIZED VIEW mv AS 
      SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b;
    2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリ文と書き換えられたクエリ文の比較を示しています。

      元のクエリ文

      改訂されたクエリ文

      SELECT a, count(DISTINCT d) FROM src GROUP BY a, b;
      SELECT a, cnt FROM mv;
      SELECT a, count(c) FROM src GROUP BY a, b;

      COUNT関数で再集計がサポートされていないため、書き換えに失敗しました。

      SELECT a, count(DISTINCT c) FROM src GROUP BY a;

      の追加の集計が必要なため、書き換えに失敗しました。

JOINによるクエリ文の書き換え

  • JOIN入力の書き換え

    1. 次のステートメントでマテリアライズド・ビューを作成します。

      CREATE MATERIALIZED VIEW mv1 AS SELECT a, b FROM j1 WHERE b > 10;
      CREATE MATERIALIZED VIEW mv2 AS SELECT a, b FROM j2 WHERE b > 10;
    2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリ文と書き換えられたクエリ文の比較を示しています。

      元のクエリ文

      書き換えられたクエリ文

      SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN j2 ON j1.a=j2.a;
      SELECT mv1.a, mv1.b, j2.a FROM mv1 JOIN j2 ON mv1.a=j2.a;
      SELECT j1.a,j1.b,j2.a FROM 
      (SELECT a,b FROM j1 WHERE b > 10) j1 
      JOIN (SELECT a,b FROM j2 WHERE b > 10) j2 ON j1.a=j2.a;
      SELECT mv1.a,mv1.b,mv2.a FROM mv1 JOIN mv2 ON mv1.a=mv2.a;
  • フィルター条件に参加する

    1. 次のステートメントでマテリアライズド・ビューを作成します。

      --Create a non-partitioned materialized view.
      CREATE MATERIALIZED VIEW mv1 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
      CREATE MATERIALIZED VIEW mv2 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 10;
      --Create a partitioned materialized view.
      CREATE MATERIALIZED VIEW mv LIFECYCLE 7 PARTITIONED BY (ds) AS SELECT t1.id, t1.ds AS ds FROM t1 JOIN t2 ON t1.id = t2.id;
    2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリ文と書き換えられたクエリ文の比較を示しています。

      元のクエリ文

      書き換えられたクエリ文

      SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a=4;
      SELECT a, b FROM mv1 WHERE a=4;
      SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 20;
      SELECT a,b FROM mv2 WHERE a>20;
      SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5;
      (SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5 AND j1.a <= 10) 
      UNION SELECT * FROM mv2;
      SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds='20210306';
      SELECT key FROM mv WHERE ds='20210306';
      SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds>='20210306';
      SELECT key FROM mv WHERE ds>='20210306';
      SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j2.a=4;

      マテリアライズドビューに列j2.aがないため、書き換えに失敗しました。

  • 追加のテーブルに参加する

    1. 次のステートメントでマテリアライズド・ビューを作成します。

      CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
    2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリステートメントと書き換えられたクエリステートメントの比較を示しています。

      元のクエリ文

      書き換えられたクエリ文

      SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j1.a=j3.a;
      SELECT mv.a, mv.b FROM mv JOIN j3 ON mv.a=j3.a;
      SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j2.a=j3.a;
      SELECT mv.a, mv.b FROM mv JOIN j3 ON mv.a=j3.a;
説明
  • 上記の3つのタイプのステートメントを組み合わせることができます。 クエリ文が書き換えの条件を満たしている場合は、それに応じて書き換えることができます。

  • MaxComputeは、実行に最も効率的な書き換えルールを選択します。 書き換え後の操作で最適な実行プランが得られない場合、書き換えルールは選択されません。

LEFT JOINを使用したクエリステートメントの書き換え

  1. 次のステートメントでマテリアライズド・ビューを作成します。

    CREATE MATERIALIZED VIEW mv LIFECYCLE 7(
            user_id,
            job,
            total_amount
    ) AS SELECT t1.user_id, t1.job, sum(t2.order_amount) AS total_amount 
          FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id GROUP BY t1.user_id;
  2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリステートメントと書き換えられたクエリステートメントの比較を示しています。

    元のクエリ文

    書き換えられたクエリ文

    SELECT t1.user_id, sum(t2.order_amount) AS total_amount 
    FROM user_info AS t1 
    LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id 
    GROUP BY t1.user_id;
    SELECT user_id, total_amount FROM mv;

UNION ALLを使用したクエリ文の書き換え

  1. 次のステートメントでマテリアライズド・ビューを作成します。

    CREATE MATERIALIZED VIEW mv LIFECYCLE 7( 
            user_id, 
            tran_amount, 
            tran_date 
    ) AS SELECT user_id, tran_amount, tran_date FROM alipay_tran UNION ALL 
    SELECT user_id, tran_amount, tran_date FROM unionpay_tran;
  2. 次の表は、作成されたマテリアライズドビューに基づいてクエリを実行するための、元のクエリステートメントと書き換えられたクエリステートメントの比較を示しています。

    元のクエリ文

    書き換えられたクエリ文

    SELECT user_id, tran_amount FROM alipay_tran 
    UNION ALL SELECT user_id, tran_amount FROM unionpay_tran;
    SELECT user_id, total_amount FROM mv;

マテリアライズド・ビューでの侵入クエリの実行

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

查询透穿图示

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

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

次の例は、マテリアライズドビューに基づいて侵入クエリを実行する方法を示しています。

  1. 侵入クエリをサポートするパーティション分割マテリアライズドビューを作成します。

    -- Create a table named src. 
    CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string);
    -- Insert data into the table. 
    INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex');
    INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink');
    
    -- Create a partitioned materialized view that supports penetration query. 
    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';
    -- The preceding statement is equivalent to the following statement because the mv materialized view does not contain the data of the 20210102 partition and the partition data needs to be queried from the src table.
    SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;
  4. mvマテリアライズドビューから20210102 20201230のパーティションのデータを照会します。 mvマテリアライズドビューにすべてのパーティションデータが含まれるわけではありません。 したがって、mv具体化ビューに含まれていないデータを取得するために侵入クエリが実行され、取得されたデータおよびmv具体化ビューからクエリされたデータに対してUNION操作が実行され、最終結果が返される。

    SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id='5'; 
    -- The mv materialized view does not contain the data of the 20210102 partition and a penetration query is performed to query the data of the 20210102 partition from the source table. The preceding statement is equivalent to the following statement:
    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';

関連ステートメント

  • ALTER MATERIALIZED VIEW: マテリアライズドビューの更新、マテリアライズドビューのライフサイクルの変更、マテリアライズドビューのライフサイクル機能の有効化または無効化、またはマテリアライズドビューからパーティションの削除。

  • DESC TABLE/VIEW: MaxComputeプロジェクトのマテリアライズドビューに関する情報を表示します。

  • SELECT MATERIALIZED VIEW: マテリアライズドビューのステータスを照会します。

  • DROP MATERIALIZED VIEW: 既存のマテリアライズドビューを削除します。