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

AnalyticDB:CREATE MATERIALIZED VIEW

最終更新日:Apr 04, 2026

このトピックでは、`CREATE MATERIALIZED VIEW` 文について説明します。この文を使用して、完全リフレッシュまたは高速リフレッシュのポリシーを持つマテリアライズドビューを作成し、その更新スケジュールを定義します。

構文

CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[COMMENT 'view_comment']
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
AS 
query_body

mv_definition:
  ({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
  | table_constraints}
  [, ... ])
  [table_attribute]
  [partition_options]
  [index_all]
  [storage_policy]
  [block_size]
  [engine]
  [table_properties]

パラメーター

OR REPLACE

オプション

作成後の変更:不可

このパラメーターは、カーネルバージョン 3.1.4.7 以降のクラスターでのみサポートされています。
  • 同じ名前のマテリアライズドビューが存在しない場合、新しいマテリアライズドビューが作成されます。

  • 同じ名前のマテリアライズドビューが既に存在する場合、システムは一時的なビューを作成し、新しいデータを入力してから、元のマテリアライズドビューを置き換えます。

mv_definition

オプション

作成後の変更:不可

マテリアライズドビューのスキーマを定義します。

この句を省略すると、システムは query_body からスキーマを推論します。デフォルトでは、システムはプライマリキーを定義し、すべての列にインデックスを作成し、ストレージポリシーをホットストレージに設定し、XUANWU エンジンを使用します。

分散キー、パーティションキー、プライマリキー、インデックス、ホット/コールドデータストレージポリシーなど、マテリアライズドビューのスキーマを手動で定義するには、CREATE TABLE 文と同じ構文を使用します。たとえば、すべての列にインデックスを作成したくない場合は、`INDEX` キーワードを使用してインデックスを作成する列を指定できます。ストレージコストを削減するために、ホット/コールド混合ストレージポリシーを定義したり、過去 1 年間のデータのみを保持したりすることもできます。

プライマリキーのルール
  • 完全リフレッシュ: プライマリキーが明示的に定義されていない場合、システムはマテリアライズドビューのプライマリキーとして列 __adb_auto_id__ を自動的に生成します。プライマリキーを明示的に定義したい場合は、クエリ本文の出力から任意の列をマテリアライズドビューのプライマリキーとして使用できます。

  • 高速リフレッシュ:明示的に定義されているか自動生成されているかに関わらず、プライマリキーは次のルールに従う必要があります:

    • グループ集計クエリ (`GROUP BY` 句を持つ集計クエリ) の場合、プライマリキーは `GROUP BY` 列でなければなりません。たとえば、GROUP BY a,b を使用する場合、プライマリキーは a と b でなければなりません。

    • 非グループ化集計クエリ (`GROUP BY` 句なし) の場合、プライマリキーは定数でなければなりません。

    • 非集計クエリの場合、プライマリキーはベーステーブルのプライマリキーと同じでなければなりません。たとえば、ベーステーブルのプライマリキーが `PRIMARY KEY(sale_id,sale_date)` の場合、マテリアライズドビューのプライマリキーも `PRIMARY KEY(sale_id,sale_date)` でなければなりません。

推奨事項

最適なクエリパフォーマンスを得るために、マテリアライズドビューを作成する際には、プライマリキー、分散キー、およびパーティションキーを定義することを推奨します。

mv_properties

オプション

作成後の変更:可 (ALTER MATERIALIZED VIEW を使用)

このパラメーターは、カーネルバージョン 3.1.9.3 以降の Enterprise Edition、Basic Edition、および Data Lakehouse Edition のクラスターでのみサポートされています。

マテリアライズドビューのリソースポリシーを定義します。これには、リソース割り当てのための `mv_resource_group` と、リフレッシュタスク構成のための `mv_refresh_hints` が含まれます。値は JSON 形式である必要があります。例:

MV_PROPERTIES='{
  "mv_resource_group":"<resource_group_name>",
  "mv_refresh_hints":{"<hint_name>":"<hint_value>"}
}'
mv_resource_group

マテリアライズドビューの作成とリフレッシュに使用されるリソースグループを指定します。指定しない場合、デフォルトの `user_default` リソースグループが使用されます。

このパラメーターの値は、XIHE エンジンの Interactive または Job リソースグループにすることができます。違いは、Job リソースグループはオンデマンドでリソースをプロビジョニングするため、通常、数秒から数分のレイテンシーが発生します。リフレッシュのレイテンシーに対する許容度が高い場合は、Job リソースグループを指定できます。Job リソースグループを使用するマテリアライズドビューは、エラスティックマテリアライズドビューとも呼ばれます。エラスティックマテリアライズドビューのリフレッシュ速度を向上させるには、`mv_refresh_hints` で elastic_job_max_acu パラメーターを構成して、マテリアライズドビューが使用できるリソースの最大量を変更できます。使用方法の詳細については、後述の「エラスティックマテリアライズドビューの例」セクションをご参照ください。

ご利用のクラスターで使用可能なリソースグループは、コンソールの「リソースグループ」ページで表示するか、DescribeDBResourceGroup 操作を呼び出すことで確認できます。

指定されたリソースグループが存在しない場合、操作は失敗します。

mv_refresh_hints

マテリアライズドビューの構成パラメーターを指定します。サポートされているパラメーターとその使用方法のリストについては、「共通のヒント」をご参照ください。

REFRESH [COMPLETE | FAST]

オプション

デフォルト値:COMPLETE

作成後の変更:不可

マテリアライズドビューのリフレッシュポリシーを定義します。リフレッシュポリシーの違いとそのユースケースについては、「リフレッシュポリシーの選択」をご参照ください。

COMPLETE

完全リフレッシュは、元のクエリ SQL を実行してベーステーブルのすべてのターゲットパーティションのデータをスキャンし、新しく計算されたデータで古いデータを完全に上書きします。

完全リフレッシュは、ON DEMAND [START WITH date] [NEXT date] および ON OVERWRITE の更新トリガーメカニズムをサポートしており、オンデマンドでの手動リフレッシュ、自動リフレッシュのスケジュール設定、またはベーステーブルが上書きされた際の自動リフレッシュが可能です。

FAST
このパラメーターはバージョン 3.1.9.0 以降でサポートされています。バージョン 3.1.9.0 は単一テーブルのマテリアライズドビューでのみ高速リフレッシュをサポートします。バージョン 3.2.0.0 以降は、単一テーブルと複数テーブルの両方のマテリアライズドビューで高速リフレッシュをサポートします。

高速リフレッシュを実行します。システムはビューのクエリ (`query_body`) を書き換え、ベーステーブルの変更されたデータ (`INSERT`、`DELETE`、および `UPDATE` 操作による) のみをスキャンし、これらの変更をマテリアライズドビューに適用します。これにより、各サイクルでベーステーブル全体をスキャンすることを回避し、各リフレッシュの計算コストを削減します。

高速リフレッシュを使用するマテリアライズドビューを作成する前に、クラスターとベーステーブルの両方でバイナリロギング機能を有効にする必要があります。そうしないと、作成は失敗します。手順については、「バイナリロギング機能の有効化」をご参照ください。

高速リフレッシュを使用するマテリアライズドビューの場合、更新トリガーメカニズムはスケジュールされた自動リフレッシュでなければなりません。ON DEMAND {NEXT date} を使用して、次のリフレッシュ時刻を定義する必要があります。

高速リフレッシュにはいくつかの制限事項があります。`query_body` が高速リフレッシュをサポートしていない場合、マテリアライズドビューを作成しようとするとエラーが発生します。

ON [DEMAND | OVERWRITE]

オプション

デフォルト値:DEMAND

作成後の変更:不可

マテリアライズドビューの更新トリガーメカニズムを定義します。更新トリガーメカニズムの違いとそのユースケースについては、「更新トリガーメカニズムの選択」をご参照ください。

DEMAND

オンデマンドリフレッシュ。これは、必要に応じてマテリアライズドビューを手動でリフレッシュしたり、NEXT を使用してスケジュールされた自動リフレッシュを指定したりできることを意味します。

高速リフレッシュのマテリアライズドビューは ON DEMAND のみをサポートします。

OVERWRITE

ベーステーブルのデータが INSERT OVERWRITE 文によって上書きされた後、マテリアライズドビューは自動的にリフレッシュされます。

更新トリガーメカニズムが ON OVERWRITE の場合、START WITH または NEXT を定義することはできません。

[START WITH date] [NEXT date]

オプション

作成後の変更:不可

マテリアライズドビューの更新トリガーメカニズムが ON DEMAND の場合、その更新スケジュールを定義できます。スケジュールが定義されていない場合、ビューは定期的にリフレッシュされません。

START WITH

最初の更新時刻。省略した場合、ビューは作成直後にリフレッシュされます。

NEXT

次のスケジュールされた更新時刻。

  • 高速リフレッシュを使用するマテリアライズドビューの場合、`NEXT` を指定する必要があります。自動更新間隔は 5 秒 (s) から 5 分 (min) の間でなければなりません。

  • 完全リフレッシュを使用するマテリアライズドビューの場合、`NEXT` はオプションです。指定する場合、最小自動更新間隔は 60 秒 (s) です。

date

時刻関数がサポートされています。時刻は秒単位で正確であり、ミリ秒は切り捨てられます。

[DISABLE | ENABLE] QUERY REWRITE

オプション

デフォルト値:DISABLE

作成後の変更:可 (ALTER MATERIALIZED VIEW を使用)

このパラメーターはバージョン 3.1.4 以降でのみサポートされています。

このマテリアライズドビューの自動クエリリライトを有効または無効にします。詳細については、「マテリアライズドビューのクエリリライト」をご参照ください。

DISABLE

現在のマテリアライズドビューのクエリリライト機能を無効にします。

ENABLE

現在のマテリアライズドビューのクエリリライト機能を有効にします。この機能を有効にすると、オプティマイザーは SQL パターンに基づいてクエリのすべてまたは一部を書き換え、マテリアライズドビューにルーティングできます。これにより、ベーステーブルでの元の計算を実行することを回避し、クエリのパフォーマンスを向上させます。

query_body

必須

作成後の変更:不可

マテリアライズドビューのベーステーブルに対するクエリを定義します。

SELECT 列のルール

`SELECT` リストの列は、次のルールに従う必要があります:

  • `GROUP BY` と集計関数がある場合: `SELECT` リストにすべての `GROUP BY` 列を含めます。

    例の表示

    正しい例 (すべての `GROUP BY` 列が含まれている):

    CREATE MATERIALIZED VIEW demo_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,    -- GROUP BY 列
      sale_date,  -- GROUP BY 列
      max(quantity) AS max,  -- 式列にはエイリアスが必要
      sum(price) AS sum
    FROM sales
    GROUP BY sale_id, sale_date;

    誤った例 (`GROUP BY` 列 sale_date が欠落している):

    CREATE MATERIALIZED VIEW false_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales
    GROUP BY sale_id, sale_date;  -- sale_date は GROUP BY にあるが SELECT にはない
  • 集計関数があり `GROUP BY` がない場合: `SELECT` リストには、集計列のみ、または定数と集計列のみを含めることができます。

    使用例

    -- 集計列のみ
    CREATE MATERIALIZED VIEW demo_mv2
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
    
    -- 定数と集計列 (定数がプライマリキーになる)
    CREATE MATERIALIZED VIEW demo_mv3
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      1 AS pk,
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
  • 集計がない場合: ベーステーブルのすべてのプライマリキー列を含めます。

    使用例

    -- 単一プライマリキー
    CREATE MATERIALIZED VIEW demo_mv4
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,   -- ベーステーブル sales のプライマリキー列
      quantity
    FROM sales;
    
    -- 複合プライマリキー: PRIMARY KEY(sale_id, sale_date)
    CREATE MATERIALIZED VIEW demo_mv5
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,    -- 最初のプライマリキー列
      sale_date,  -- 2番目のプライマリキー列
      quantity
    FROM sales1;
  • `UNION ALL` クエリ: 各ブランチは、ブランチごとに異なる定数値を持つ union_all_marker という名前の列を出力する必要があります。すべてのベーステーブルのプライマリキー列を含めます。マテリアライズドビューのプライマリキーには、ベーステーブルのプライマリキー列と union_all_marker の両方を含める必要があります。

    CREATE MATERIALIZED VIEW demo_union_all_mv (PRIMARY KEY(id, union_all_marker))
    REFRESH FAST NEXT now() + INTERVAL 5 minute
    AS
    SELECT customer_id AS id, "customer" AS union_all_marker
    FROM customer
    UNION ALL
    SELECT sale_id AS id, "sales" AS union_all_marker
    FROM sales;
  • 式列: `SELECT` リスト内のすべての式列には、エイリアスが必要です (例:SUM(price) AS total_price)。

その他の制限事項

    必要な権限

      前提条件

      このトピックの例では、このセクションで作成されたベーステーブルを使用します。例を実行するには、まず次の SQL 文を使用してベーステーブルを作成してください。

      /*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- テーブルエンジンを XUANWU に設定します。
      CREATE TABLE customer (
          customer_id INT PRIMARY KEY,
          customer_name VARCHAR(255),
          is_vip Boolean
      );
      
      /*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- テーブルエンジンを XUANWU に設定します。
      CREATE TABLE sales (
          sale_id INT PRIMARY KEY,
          product_id INT,
          customer_id INT,
          price DECIMAL(10, 2),
          quantity INT,
          sale_date TIMESTAMP
      );

      完全リフレッシュのマテリアライズドビュー

      • 5 分ごとにリフレッシュされるマテリアライズドビュー myview1 を作成します。

        CREATE MATERIALIZED VIEW myview1
        REFRESH   -- REFRESH COMPLETE と同等
         NEXT now() + INTERVAL 5 minute
        AS
        SELECT count(*) as cnt FROM customer;
      • 毎日午前 2:00 にリフレッシュされるマテリアライズドビュー myview2 を作成します。

        CREATE MATERIALIZED VIEW myview2
        REFRESH COMPLETE
         START WITH DATE_FORMAT(now() + INTERVAL 1 day, '%Y-%m-%d 02:00:00')
         NEXT DATE_FORMAT(now() + INTERVAL 1 day, '%Y-%m-%d 02:00:00')
        AS
        SELECT count(*) as cnt FROM customer;
      • 毎週月曜日の午前 2:00 にリフレッシュされるマテリアライズドビュー myview3 を作成します。

        CREATE MATERIALIZED VIEW myview3
        REFRESH COMPLETE ON DEMAND
         START WITH DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') 
         NEXT DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00')
        AS
        SELECT count(*) as cnt FROM customer;
      • 毎月 1 日の午前 2:00 にリフレッシュされるマテリアライズドビュー myview4 を作成します。

        CREATE MATERIALIZED VIEW myview4
        REFRESH   -- REFRESH COMPLETE と同等
         NEXT DATE_FORMAT(last_day(now()) + INTERVAL 1 day, '%Y-%m-%d 02:00:00')
        AS
        SELECT count(*) as cnt FROM customer;
      • 一度だけリフレッシュされるマテリアライズドビュー myview5 を作成します。

        CREATE MATERIALIZED VIEW myview5
        REFRESH   -- REFRESH COMPLETE と同等
         START WITH now() + INTERVAL 1 day
        AS 
        SELECT count(*) as cnt FROM customer;
      • 自動的にリフレッシュされず、完全に手動リフレッシュに依存するマテリアライズドビュー myview6 を作成します。

        CREATE MATERIALIZED VIEW myview6 (
          PRIMARY KEY (customer_id)
        ) DISTRIBUTED BY HASH (customer_id)
        AS
        SELECT customer_id FROM customer;

        マテリアライズドビューを手動でリフレッシュします:

        REFRESH MATERIALIZED VIEW myview6;
      • マテリアライズドビュー myview7 を作成します。ベーステーブルが `INSERT OVERWRITE` 操作によって上書きされた後にマテリアライズドビューが自動的にリフレッシュされるため、手動でリフレッシュ時刻を定義する必要はありません。

        CREATE MATERIALIZED VIEW myview7
        REFRESH COMPLETE ON OVERWRITE
        AS
        SELECT count(*) as cnt FROM customer;

      高速リフレッシュの単一テーブルマテリアライズドビュー

      高速リフレッシュを使用するマテリアライズドビューを作成する前に、クラスターとベーステーブルのバイナリロギング機能を有効にする必要があります。
      SET ADB_CONFIG BINLOG_ENABLE=true;
      ALTER TABLE customer binlog=true;
      ALTER TABLE sales binlog=true;

        高速リフレッシュの複数テーブルマテリアライズドビュー

        • 高速リフレッシュを使用し、集計なしの複数テーブルマテリアライズドビュー `fast_mv4` を作成します。5 秒ごとにリフレッシュされます。

          CREATE MATERIALIZED VIEW fast_mv4
          REFRESH FAST NEXT now() + INTERVAL 5 second
          AS
          SELECT 
              c.customer_id,
              c.customer_name,
              s.sale_id,
              (s.price * s.quantity) AS revenue
          FROM 
              sales s
          JOIN 
              customer c ON s.customer_id = c.customer_id;
        • 高速リフレッシュとグループ化集計を使用する複数テーブルマテリアライズドビュー `fast_mv5` を作成します。10 秒ごとにリフレッシュされます。

          CREATE MATERIALIZED VIEW fast_mv5
          REFRESH FAST NEXT now() + INTERVAL 10 second
          AS
          SELECT 
              s.sale_id,
              c.customer_name,
              COUNT(*) AS cnt,           
              SUM(s.price * s.quantity) AS revenue                
          FROM 
              sales s
          JOIN 
              (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id
          GROUP BY 
              s.sale_id, c.customer_name;

        パーティション化されたマテリアライズドビュー

        マテリアライズドビュー myview8 を作成し、分散キーとパーティションキーを定義します。

        CREATE MATERIALIZED VIEW myview8 (
          quantity INT,    -- マテリアライズドビューには、定義で明示的にリストされていなくても、クエリ結果のすべての列が含まれます。
          price DECIMAL(10, 2),
          sale_date TIMESTAMP
        ) 
        DISTRIBUTED BY HASH(sale_id)
        PARTITION BY VALUE(date_format(sale_date, "%Y%m%d")) LIFECYCLE 30
        AS 
        SELECT * FROM sales;

        キーとインデックスの定義

        • マテリアライズドビュー myview9 を作成し、すべての列ではなく、指定された列 customer_name にのみインデックスを作成します。

          CREATE MATERIALIZED VIEW myview9 (
            INDEX (sale_date),
            PRIMARY KEY (sale_id)
          ) DISTRIBUTED BY HASH (sale_id)
          REFRESH
           NEXT now() + INTERVAL 1 DAY
          AS
          SELECT * FROM sales;
        • プライマリキー、分散キー、クラスタリングインデックス、指定列のインデックス、およびコメントを指定して、myview10 という名前のマテリアライズドビューを作成します。

          CREATE MATERIALIZED VIEW myview10 (
            quantity INT,    -- マテリアライズドビューには、定義で明示的にリストされていなくても、クエリ結果のすべての列が含まれます。
            price DECIMAL(10, 2),
            KEY INDEX_ID(customer_id) COMMENT '顧客',
            CLUSTERED KEY INDEX(sale_id),
            PRIMARY KEY(sale_id,sale_date)
          ) 
          DISTRIBUTED BY HASH(sale_id)
          COMMENT 'マテリアライズドビュー c'
          AS 
          SELECT * FROM sales;

        エラスティックマテリアライズドビュー

        • Job タイプのリソースグループ `serverless` を使用して作成およびリフレッシュし、1 日 1 回の更新頻度を持つエラスティックマテリアライズドビュー myview11 を作成します。

          CREATE MATERIALIZED VIEW myview11
          MV_PROPERTIES='{
            "mv_resource_group":"serverless"
          }'
          REFRESH COMPLETE ON DEMAND
           START WITH now()
           NEXT now() + INTERVAL 1 DAY
          AS
          SELECT * FROM sales;
        • Job タイプのリソースグループ `serverless` を作成とリフレッシュに使用し、このグループから 12 ACU のリソースを使用できるエラスティックマテリアライズドビュー myview12 を作成します。

          CREATE MATERIALIZED VIEW myview12
          MV_PROPERTIES='{
            "mv_resource_group":"serverless",
            "mv_refresh_hints":{"elastic_job_max_acu":"12"}
          }'
          REFRESH COMPLETE ON DEMAND
           START WITH now()
           NEXT now() + INTERVAL 1 DAY
          AS
          SELECT * FROM sales;

        関連トピック