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

ApsaraDB for SelectDB:同期マテリアライズドビュー

最終更新日:Nov 04, 2025

繰り返し発生する時間のかかる複雑なクエリを最適化する必要がある場合、ApsaraDB for SelectDB の同期マテリアライズドビュー機能を使用して複雑なクエリのデータをキャッシュし、高速なアクセスと効率的なデータ処理を実現できます。

概要

同期マテリアライズドビューは、定義された SELECT 文に基づいて事前に計算されたデータセットであり、SelectDB の特別なテーブルに格納されます。クエリ中に、システムは最適な同期マテリアライズドビューを自動的に照合し、そこから直接データを読み取ります。同期マテリアライズドビューには、次の特徴があります

  • クエリの応答時間を短縮できます

    同期マテリアライズドビューは、計算結果を事前に保存することでクエリの応答時間を短縮します。

  • 自動同期メカニズムにより、手動でのデータメンテナンスは不要です

  • データはベーステーブルとリアルタイムで一貫性を保ちます

    データの挿入、更新、または削除のシナリオでは、SelectDB はベーステーブルと同期マテリアライズドビュー間の強力な整合性を確保し、組み込みの増分更新メカニズムを通じてマテリアライズドビューデータの有効性を維持します。

注意

  • 使用上の注意:

    • 直接クエリはサポートされていません。

      非同期マテリアライズドビューとは異なり、同期マテリアライズドビューを直接クエリすることはできません。クエリ文は引き続きベーステーブルをクエリしますSelectDB がクエリ文を受け取ると、最適なマテリアライズドビューを自動的に選択し、マテリアライズドビューからデータを読み取って計算を実行します。詳細については、「クエリの自動照合」をご参照ください。

    • Unique モデルでは、同期マテリアライズドビューを作成してデータに対して粗粒度の集約操作を実行することはできません。

      これは、Unique データモデルの同期マテリアライズドビューは列の順序を変更することしかできず、集約の目的には使用できないためです。

  • パフォーマンスへの影響: 1 つのテーブルに同期マテリアライズドビューが多すぎると、データインポートの効率に影響します。

    データインポート中、同期マテリアライズドビューとベーステーブルのデータは同期的に更新されます。

    例: 1 つのテーブルに対して 10 を超える同期マテリアライズドビューテーブルが作成された場合、インポート速度が非常に遅くなる可能性があります。これは、1 回のインポート操作で 10 を超えるテーブルに同時にデータをインポートする必要があるためです。

ユースケース

  • 時間のかかる集約操作を高速化します。

  • クエリは異なるプレフィックスインデックスに一致させる必要があります。

  • 事前フィルタリングによってスキャンするデータ量を削減します。

  • 複雑な式の計算を事前に完了させることでクエリを高速化します。

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

原則

マテリアライズドビューを作成する前に、クエリ文の特性に基づいて作成するマテリアライズドビューのタイプを決定する必要があります。クエリ文と完全に一致するマテリアライズドビュー定義を持つことが常に理想的な状況であるとは限りません。以下は、マテリアライズドビューを作成するための 2 つの原則です。

  • 複数のクエリから共通のグループ化と集約メソッドを抽出し、マテリアライズドビューの定義とします。

    複数のクエリで照合できる抽象化されたマテリアライズドビューが最も効果的です。これは、マテリアライズドビューのメンテナンスにもリソースを消費するためです。マテリアライズドビューが特定のクエリにのみ一致し、他のクエリで使用できない場合、より多くのクエリに役立たない一方でクラスターのストレージリソースを占有するため、その費用対効果は低くなります。

  • すべてのディメンションの組み合わせに対してマテリアライズドビューを作成する必要はありません。

    実際の分析クエリでは、すべてのディメンション分析がカバーされるわけではありません。したがって、一般的に使用されるディメンションの組み合わせに対してのみマテリアライズドビューを作成することで、スペースと時間のバランスをとることができます。

注意

  • SELECT 文

    • サポート対象は単一のテーブルに基づく SELECT 文のみです

    • SELECT 列には、自動インクリメント列、定数、重複する式、またはウィンドウ関数を含めることはできません。

    • SELECT 列に、作成されたテーブルのパーティションキー列とバケット列が含まれている場合、これらの列はマテリアライズドビューでキー列として使用する必要があります。

  • WHERE、GROUP BY、および ORDER BY 句は許可されますが、JOIN、HAVING、LIMIT、および LATERAL VIEW は禁止されています

  • サポートされている集計関数

    重要
    • 集計関数のパラメーターは式をサポートせず、単一の列のみをサポートします。例: sum(a) はサポートされますが、sum(a+b) はサポートされません。

    • 同じ列に対して異なる集計関数を使用することはできません。例: select sum(a), min(a) from table はサポートされません。

    現在、同期マテリアライズドビューを作成するための文では、次の集計関数がサポートされています。

    • SUM、MIN、MAX。

    • COUNT。

    • BITMAP_UNION 関数は、次の 2 つの場合にのみマテリアライズドビューの作成をサポートします。

      • BITMAP_UNION(TO_BITMAP(COLUMN)) 形式を使用する場合、列 (COLUMN) の型は整数のみ可能で、largeint 型は除きます。

      • `BITMAP_UNION(COLUMN)` 形式を使用する場合、ベーステーブルは Aggregate モデルである必要があります。

    • HLL_UNION 関数は、次の 2 つの場合にのみマテリアライズドビューの作成をサポートします。

      • `HLL_UNION(HLL_HASH(COLUMN))` 形式を使用する場合、列 (COLUMN) の型は DECIMAL にはできません。

      • `HLL_UNION(COLUMN)` 形式を使用する場合、ベーステーブルは Aggregate モデルである必要があります。

構文

CREATE MATERIALIZED VIEW <mv_name> as <query>
[PROPERTIES ("key" = "value")]

パラメーターの説明

パラメーター名

必須

説明

mv_name

はい

同期マテリアライズドビューの名前。同じベーステーブルのマテリアライズドビュー名は重複できません。

query

はい

同期マテリアライズドビューを構築するために使用されるクエリ文。

クエリ文の結果がマテリアライズドビューのデータになります。詳細については、「以下のクエリパラメーターの説明」をご参照ください。

properties

いいえ

マテリアライズドビューの関連構成を宣言します。フォーマットは次のとおりです。

PROPERTIES ("key" = "value", "key" = "value" ...)

このプロパティでは、次の構成を定義できます。

short_key: ソート列の数。
timeout: マテリアライズドビュー構築のタイムアウト。

クエリパラメーターの説明は次のとおりです。

現在サポートされているクエリフォーマットは次のとおりです。

SELECT select_expr[, select_expr ...]FROM <base_view_name>GROUP BY column_name[, column_name ...]ORDER BY column_name[, column_name ...]

パラメーターの説明は次のとおりです。

パラメーター名

必須

説明

select_expr

はい

同期マテリアライズドビューのスキーマ内のすべての列。少なくとも 1 つの単一列を含める必要があります。

base_view_name

はい

同期マテリアライズドビューのベーステーブル。サブクエリではなく、単一のテーブルである必要があります。

group by

いいえ

同期マテリアライズドビューのグループ化列。指定しない場合、データはグループ化されません。

order by

いいえ

同期マテリアライズドビューのソート。

  • ソート列の宣言順序は、select_expr の列宣言順序と一致している必要があります。

  • order by が宣言されていない場合、ソート列はルールに従って自動的に補完されます。

    • 同期マテリアライズドビューが集約タイプの場合、すべてのグループ化列が自動的にソート列として補完されます。

    • 同期マテリアライズドビューが非集約タイプの場合、最初の 36 バイトが自動的にソート列として補完されます。

    • 自動的に補完されるソート列の数が 3 未満の場合、最初の 3 つがソート列として使用されます。

    • クエリにグループ化列が含まれている場合、ソート列はグループ化列と一致している必要があります。

  1. 1. サンプルのベーステーブルを準備します。

    以下のように、サンプルテーブル duplicate_table を作成します。

    CREATE TABLE duplicate_table(
        k1 int null,
        k2 int null,
        k3 bigint null,
        k4 bigint null
    )
    DUPLICATE KEY (k1,k2,k3,k4)
    DISTRIBUTED BY HASH(k4) BUCKETS 3;

    以下のように、サンプルテーブル duplicate_table のテーブル構造をクエリします。

    DESC duplicate_table;
    +-------+--------+------+------+---------+-------+
    | Field | Type   | Null | Key  | Default | Extra |
    +-------+--------+------+------+---------+-------+
    | k1    | INT    | Yes  | true | N/A     |       |
    | k2    | INT    | Yes  | true | N/A     |       |
    | k3    | BIGINT | Yes  | true | N/A     |       |
    | k4    | BIGINT | Yes  | true | N/A     |       |
    +-------+--------+------+------+---------+-------+
  2. 2. 同期マテリアライズドビューを作成します。

    • 元のテーブルの (k1, k2) 列のみを含むマテリアライズドビューを以下のように作成します。

      CREATE MATERIALIZED VIEW k1_k2 AS
      SELECT k2, k1 FROM duplicate_table;

      マテリアライズドビューのスキーマは次のとおりです。マテリアライズドビューには k1、k2 の 2 つの列のみが含まれ、集約は含まれません。

      +-----------------+-------+--------+------+------+---------+-------+
      | IndexName       | Field | Type   | Null | Key  | Default | Extra |
      +-----------------+-------+--------+------+------+---------+-------+
      | k2_k1           | k2    | INT    | Yes  | true | N/A     |       |
      |                 | k1    | INT    | Yes  | true | N/A     |       |
      +-----------------+-------+--------+------+------+---------+-------+
    • k2 をソート列として同期マテリアライズドビューを以下のように作成します。

      CREATE MATERIALIZED VIEW k2_order AS
      SELECT k2, k1 FROM duplicate_table ORDER BY k2;

      マテリアライズドビューのスキーマは次のとおりです。マテリアライズドビューには k2、k1 の 2 つの列のみが含まれ、k2 はソート列であり、集約は含まれません。

      +-----------------+-------+--------+------+-------+---------+-------+
      | IndexName       | Field | Type   | Null | Key   | Default | Extra |
      +-----------------+-------+--------+------+-------+---------+-------+
      | k2_order        | k2    | INT    | Yes  | true  | N/A     |       |
      |                 | k1    | INT    | Yes  | false | N/A     | NONE  |
      +-----------------+-------+--------+------+-------+---------+-------+
    • k1、k2 でグループ化し、k3 列に SUM 集約を行うマテリアライズドビューを以下のように作成します。

      CREATE MATERIALIZED VIEW k1_k2_sumk3 AS
      SELECT k1, k2, sum(k3) FROM duplicate_table GROUP BY k1, k2;

      マテリアライズドビューのスキーマは次のとおりです。k1、k2、sum(k3) の 2 つの列が含まれています。ここで、k1、k2 はグループ化列であり、sum(k3) は k1、k2 でグループ化した後の k3 列の合計です。マテリアライズドビューはソート列を宣言せず、集約データを含んでいるため、システムはグループ化列 k1、k2 をソート列として自動的に補完します。

      +-----------------+-------+--------+------+-------+---------+-------+
      | IndexName       | Field | Type   | Null | Key   | Default | Extra |
      +-----------------+-------+--------+------+-------+---------+-------+
      | k1_k2_sumk3     | k1    | INT    | Yes  | true  | N/A     |       |
      |                 | k2    | INT    | Yes  | true  | N/A     |       |
      |                 | k3    | BIGINT | Yes  | false | N/A     | SUM   |
      +-----------------+-------+--------+------+-------+---------+-------+

マテリアライズドビューのクエリ

特定のテーブルに基づいて作成されたすべてのマテリアライズドビューをクエリします。

構文

DESC <table_name> ALL;

パラメーターの説明

table_name はマテリアライズドビューのベーステーブルです。

ベーステーブルとして duplicate_table を持つマテリアライズドビューをクエリします。

DESC duplicate_table ALL;

クエリ結果は次のとおりです。

+-----------------+---------------+---------------+--------+--------------+------+-------+---------+-------+---------+------------+-------------+
| IndexName       | IndexKeysType | Field         | Type   | InternalType | Null | Key   | Default | Extra | Visible | DefineExpr | WhereClause |
+-----------------+---------------+---------------+--------+--------------+------+-------+---------+-------+---------+------------+-------------+
| duplicate_table | DUP_KEYS      | k1            | INT    | INT          | Yes  | true  | NULL    |       | true    |            |             |
|                 |               | k2            | INT    | INT          | Yes  | true  | NULL    |       | true    |            |             |
|                 |               | k3            | BIGINT | BIGINT       | Yes  | true  | NULL    |       | true    |            |             |
|                 |               | k4            | BIGINT | BIGINT       | Yes  | true  | NULL    |       | true    |            |             |
|                 |               |               |        |              |      |       |         |       |         |            |             |
| k2_order        | DUP_KEYS      | mv_k2         | INT    | INT          | Yes  | true  | NULL    |       | true    | `k2`       |             |
|                 |               | mv_k1         | INT    | INT          | Yes  | false | NULL    | NONE  | true    | `k1`       |             |
|                 |               |               |        |              |      |       |         |       |         |            |             |
| k1_k2           | DUP_KEYS      | mv_k2         | INT    | INT          | Yes  | true  | NULL    |       | true    | `k2`       |             |
|                 |               | mv_k1         | INT    | INT          | Yes  | true  | NULL    |       | true    | `k1`       |             |
|                 |               |               |        |              |      |       |         |       |         |            |             |
| k1_k2_sumk3     | AGG_KEYS      | mv_k1         | INT    | INT          | Yes  | true  | NULL    |       | true    | `k1`       |             |
|                 |               | mv_k2         | INT    | INT          | Yes  | true  | NULL    |       | true    | `k2`       |             |
|                 |               | mva_SUM__`k3` | BIGINT | BIGINT       | Yes  | false | NULL    | SUM   | true    | `k3`       |             |
+-----------------+---------------+---------------+--------+--------------+------+-------+---------+-------+---------+------------+-------------+

クエリ結果に基づくと、サンプルテーブル duplicate_table には、k1_k2k2_orderk1_k2_sumk3 の合計 3 つのマテリアライズドビューとそのテーブル構造があります。

マテリアライズドビューの削除

同期マテリアライズドビューが不要になった場合は、コマンドを使用して削除したり、作成をキャンセルしたりできます。

  • 未完了のマテリアライズドビューの削除

    未完了のマテリアライズドビュー作成をキャンセルする場合は、次のコマンドを使用できます。

    構文

    CANCEL ALTER TABLE MATERIALIZED VIEW FROM <database>.<table_name>;

    パラメーターの説明

    パラメーター名

    必須

    説明

    database

    はい

    削除するマテリアライズドビューが属するデータベース名

    table_name

    はい

    削除するマテリアライズドビューが属するテーブル名。

    ベーステーブル duplicate_table の未完了のマテリアライズドビューをすべてキャンセルします。

    CANCEL ALTER TABLE MATERIALIZED VIEW FROM test_db.duplicate_table;

    マテリアライズドビューがすでに作成されている場合、このコマンドを使用してキャンセルすることはできませんが、削除コマンドを使用して削除することはできます。

  • 完了したマテリアライズドビューの削除

    マテリアライズドビューがすでに作成されている場合は、削除コマンドを使用して削除できます。

    構文

    DROP MATERIALIZED VIEW [IF EXISTS] <mv_name> ON <table_name>;

    パラメーターの説明

    パラメーター名

    必須

    説明

    IF EXISTS

    いいえ

    マテリアライズドビューが存在しない場合、エラーをスローしません。このキーワードを指定しない場合、マテリアライズドビューが存在しないとエラーが報告されます

    mv_name

    はい

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

    table_name

    はい

    削除するマテリアライズドビューのベーステーブル。

    1. ベーステーブル duplicate_table のマテリアライズドビューとそのテーブル構造を以下のように表示します。

      DESC duplicate_table ALL;

      クエリ結果は次のとおりです。

      +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+
      | IndexName       | IndexKeysType | Field | Type   | InternalType | Null | Key  | Default | Extra | Visible | DefineExpr | WhereClause |
      +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+
      | duplicate_table | DUP_KEYS      | k1    | INT    | INT          | Yes  | true | NULL    |       | true    |            |             |
      |                 |               | k2    | INT    | INT          | Yes  | true | NULL    |       | true    |            |             |
      |                 |               | k3    | BIGINT | BIGINT       | Yes  | true | NULL    |       | true    |            |             |
      |                 |               | k4    | BIGINT | BIGINT       | Yes  | true | NULL    |       | true    |            |             |
      |                 |               |       |        |              |      |      |         |       |         |            |             |
      | k1_k2           | DUP_KEYS      | mv_k2 | INT    | INT          | Yes  | true | NULL    |       | true    | `k2`       |             |
      |                 |               | mv_k1 | INT    | INT          | Yes  | true | NULL    |       | true    | `k1`       |             |
      +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+
    2. ベーステーブル duplicate_table から k1_k2 という名前のマテリアライズドビューを削除します。

      DROP MATERIALIZED VIEW k1_k2 ON duplicate_table;
    3. マテリアライズドビューを削除した後、ベーステーブル duplicate_table のマテリアライズドビューとそのテーブル構造を以下のように表示します。

      DESC duplicate_table ALL;

      クエリ結果は以下のとおりです。

      +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+
      | IndexName       | IndexKeysType | Field | Type   | InternalType | Null | Key  | Default | Extra | Visible | DefineExpr | WhereClause |
      +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+
      | duplicate_table | DUP_KEYS      | k1    | INT    | INT          | Yes  | true | NULL    |       | true    |            |             |
      |                 |               | k2    | INT    | INT          | Yes  | true | NULL    |       | true    |            |             |
      |                 |               | k3    | BIGINT | BIGINT       | Yes  | true | NULL    |       | true    |            |             |
      |                 |               | k4    | BIGINT | BIGINT       | Yes  | true | NULL    |       | true    |            |             |
      +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+

ステータスの表示

同期マテリアライズドビューの作成は非同期操作です。作成タスクを送信すると、SelectDB は作成が成功するまでバックグラウンドで既存データを計算します。コマンドを使用して、マテリアライズドビューが構築されたかどうかを確認できます。

構文

SHOW ALTER TABLE MATERIALIZED VIEW FROM <database>

パラメーターの説明

database は、同期マテリアライズドビューのベーステーブルが属するデータベースです。このコマンドの結果には、そのデータベースのすべてのマテリアライズドビュー作成タスクが表示されます。

test_db データベースのマテリアライズドビュー作成タスク情報を表示します。

SHOW ALTER TABLE MATERIALIZED VIEW FROM test_db;

-- 結果
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+
| JobId  | TableName     | CreateTime          | FinishTime          | BaseIndexName | RollupIndexName | RollupId | TransactionId | State    | Msg  | Progress | Timeout |
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+
| 494349 | sales_records | 2020-07-30 20:04:56 | 2020-07-30 20:04:57 | sales_records | store_amt       | 494350   | 133107        | FINISHED |      | NULL     | 2592000 |
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+

結果の説明は次のとおりです。

フィールド名

説明

TableName

マテリアライズドビューデータのソーステーブルを指します。

BaseIndexName

ベーステーブル名。

RollupIndexName

マテリアライズドビューの名前。

State

タスクのステータス。

  • PENDING、タスクは作成され、スケジュール中です。

  • RUNNING、タスクは進行中です。

  • FINISHDED、タスクは完了しました。

  • CANCELLED、タスクはキャンセルされました。

State が FINISHED になると、マテリアライズドビューは正常に作成されています。

文の表示

コマンドを使用して、マテリアライズドビューの作成に使用された文を表示します。

構文

この構文では、すでに削除されたマテリアライズドビューをクエリすることはできません。

SHOW CREATE MATERIALIZED VIEW <mv_name> ON <table_name>

パラメーターの説明

パラメーター名

必須

説明

mv_name

はい

マテリアライズドビューの名前

table_name

はい

マテリアライズドビューのベーステーブル。

  1. 次の作成文でサンプルのマテリアライズドビューを準備します。

    CREATE MATERIALIZED VIEW id_col1 AS SELECT id,col1 FROM table3;
  2. 作成されたマテリアライズドビューの作成文を以下のように表示します。

    SHOW CREATE MATERIALIZED VIEW id_col1 ON table3;

    クエリ結果は次のとおりです。

    SHOW CREATE MATERIALIZED VIEW id_col1 on table3;
    +-----------+----------+----------------------------------------------------------------+
    | TableName | ViewName | CreateStmt                                                     |
    +-----------+----------+----------------------------------------------------------------+
    | table3    | id_col1  | create materialized view id_col1 as select id,col1 from table3 |
    +-----------+----------+----------------------------------------------------------------+
    1 row in set (0.00 sec)

クエリの自動照合

マテリアライズドビューが正常に作成された後、クエリはまったく変更する必要がなく、引き続きベーステーブルをクエリします。SelectDB は、現在のクエリ文に基づいて最適なマテリアライズドビューを自動的に選択し、マテリアライズドビューからデータを読み取って計算を実行します。

`EXPLAIN` コマンドを使用して、現在のクエリがマテリアライズドビューを使用しているかどうかを確認できます。`EXPLAIN` の詳細については、「クエリの説明」をご参照ください。

マテリアライズドビューの集約とクエリの集約の照合関係は次のとおりです。

マテリアライズドビューの集約

クエリの集約

sum

sum

min

min

max

max

count

count

bitmap_union

bitmap_union, bitmap_union_count, count(distinct)

hll_union

hll_raw_agg, hll_union_agg, ndv, approx_count_distinct

`bitmap` と `hll` の集計関数がクエリ中にマテリアライズドビューと一致する場合、クエリの集計オペレーターはマテリアライズドビューのテーブルスキーマに基づいて書き換えられます。

完全な使用例

マテリアライズドビューの使用には、次の 3 つのステップが含まれます。

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

  2. マテリアライズドビューの構築が完了したかどうかを非同期で確認します。

  3. マテリアライズドビューをクエリし、自動的に照合します。

例の背景

たとえば、広告の PV と UV を計算するビジネスシナリオでは、元の広告クリックデータは SelectDB に保存されます。したがって、集約タイプが bitmap_union のマテリアライズドビューを作成することで、広告の PV と UV のクエリを高速化できます。

準備: ベーステーブルの設計

広告クリックデータの詳細を保存するために、テーブル advertiser_view_record を作成します。フィールドには、各広告クリックの時刻、クリックされた広告、クリックが発生したチャネル、およびクリックしたユーザーが含まれます。具体的な文は次のとおりです。

CREATE TABLE advertiser_view_record(
    time date, 
    advertiser varchar(10),
    channel varchar(10),
    user_id int
  ) 
DISTRIBUTED BY HASH(time);

元の広告クリックデータテーブルのテーブル構造を以下のようにクエリします。

DESC advertiser_view_record ALL;
+------------------------+---------------+------------+-------------+--------------+------+-------+---------+-------+---------+------------+-------------+
| IndexName              | IndexKeysType | Field      | Type        | InternalType | Null | Key   | Default | Extra | Visible | DefineExpr | WhereClause |
+------------------------+---------------+------------+-------------+--------------+------+-------+---------+-------+---------+------------+-------------+
| advertiser_view_record | DUP_KEYS      | time       | DATE        | DATEV2       | Yes  | true  | NULL    |       | true    |            |             |
|                        |               | advertiser | VARCHAR(10) | VARCHAR(10)  | Yes  | true  | NULL    |       | true    |            |             |
|                        |               | channel    | VARCHAR(10) | VARCHAR(10)  | Yes  | false | NULL    | NONE  | true    |            |             |
|                        |               | user_id    | INT         | INT          | Yes  | false | NULL    | NONE  | true    |            |             |
+------------------------+---------------+------------+-------------+--------------+------+-------+---------+-------+---------+------------+-------------+
4 rows in set (0.02 sec)

ステップ 1: マテリアライズドビューの作成

  1. 設計分析。

    広告の UV 値をクエリするには、同じ広告のユーザーに対して正確な重複排除を実行する必要があります。通常のクエリ方法は次のとおりです。

    SELECT advertiser, channel, COUNT(distinct user_id) 
    FROM advertiser_view_record 
    GROUP BY advertiser, channel;

    このタイプの UV クエリシナリオでは、bitmap_union を使用してマテリアライズドビューを作成し、事前の正確な重複排除を実現できます。SelectDB では、count(distinct) 集約と bitmap_union_count 集約の結果は完全に一致します。そして、bitmap_union_countbitmap_union の結果をカウントすることに等しいです。したがって、クエリに count(distinct) が含まれる場合、bitmap_union 集約を使用してマテリアライズドビューを作成することでクエリ速度を高速化できます。この場合、広告とチャネルでグループ化し、user_id 列で正確な重複排除を行うマテリアライズドビューを作成できます。

  2. マテリアライズドビューを作成します。

    上記の分析に基づいて、広告とチャネルでグループ化し、user_id で正確な重複排除を行うマテリアライズドビューを作成します。文は次のとおりです。

    CREATE MATERIALIZED VIEW advertiser_uv AS SELECT advertiser, channel, bitmap_union(to_bitmap(user_id)) FROM advertiser_view_record GROUP BY advertiser, channel;
    Query OK, 0 rows affected (0.012 sec)
    説明

    user_id は INT 型であるため、SelectDB では、bitmap_union 集約を実行する前に、まず to_bitmap 関数を使用してフィールドをビットマップ型に変換する必要があります。

    マテリアライズドビューを作成した後、広告クリック詳細テーブルのマテリアライズドビューとそのテーブル構造を以下のようにクエリします。

     DESC advertiser_view_record ALL;
    +------------------------+---------------+-------------------------------------------------------------------+-------------+--------------+------+-------+---------+--------------+---------+-------------------------------------------------+-------------+
    | IndexName              | IndexKeysType | Field                                                             | Type        | InternalType | Null | Key   | Default | Extra        | Visible | DefineExpr                                      | WhereClause |
    +------------------------+---------------+-------------------------------------------------------------------+-------------+--------------+------+-------+---------+--------------+---------+-------------------------------------------------+-------------+
    | advertiser_view_record | DUP_KEYS      | time                                                              | DATE        | DATEV2       | Yes  | true  | NULL    |              | true    |                                                 |             |
    |                        |               | advertiser                                                        | VARCHAR(10) | VARCHAR(10)  | Yes  | true  | NULL    |              | true    |                                                 |             |
    |                        |               | channel                                                           | VARCHAR(10) | VARCHAR(10)  | Yes  | false | NULL    | NONE         | true    |                                                 |             |
    |                        |               | user_id                                                           | INT         | INT          | Yes  | false | NULL    | NONE         | true    |                                                 |             |
    |                        |               |                                                                   |             |              |      |       |         |              |         |                                                 |             |
    | advertiser_uv          | AGG_KEYS      | mv_advertiser                                                     | VARCHAR(*)  | VARCHAR(*)   | Yes  | true  | NULL    |              | true    | `advertiser`                                    |             |
    |                        |               | mv_channel                                                        | VARCHAR(*)  | VARCHAR(*)   | Yes  | true  | NULL    |              | true    | `channel`                                       |             |
    |                        |               | mva_BITMAP_UNION__to_bitmap_with_check(CAST(`user_id` AS BIGINT)) | BITMAP      | BITMAP       | No   | false | NULL    | BITMAP_UNION | true    | to_bitmap_with_check(CAST(`user_id` AS BIGINT)) |             |
    +------------------------+---------------+-------------------------------------------------------------------+-------------+--------------+------+-------+---------+--------------+---------+-------------------------------------------------+-------------+
    8 rows in set (0.03 sec)

ステップ 2: ビューの構築が完了したかどうかの確認

コマンド ステータスの表示 を使用します。ステータスが FINISHED になると、マテリアライズドビューは正常に作成されています。

ステップ 3: クエリの自動照合

  1. クエリ文を実行します。

    マテリアライズドビューテーブルが作成されると、広告 UV をクエリするときに、SelectDB は作成されたマテリアライズドビュー advertiser_uv から自動的にデータをクエリします。例は次のとおりです。

    SELECT advertiser, channel, COUNT(distinct user_id) FROM advertiser_view_record GROUP BY advertiser, channel;

    マテリアライズドビューにヒットした後、SelectDB は実際のクエリを暗黙的に次のクエリに変換します。

    SELECT advertiser, channel, bitmap_union_count(to_bitmap(user_id)) FROM advertiser_uv GROUP BY advertiser, channel;
  2. クエリがマテリアライズドビューを使用しているかどうかを確認します。

    EXPLAIN コマンドを使用して、SelectDB がマテリアライズドビューと一致したかどうかを以下のように確認できます

    EXPLAIN SELECT advertiser, channel, count(distinct user_id) FROM advertiser_view_record GROUP BY advertiser, channel;
    +-------------------------------------------------------------------------------------------------------------------------------------------------+
    | Explain String                                                                                                                                  |
    +-------------------------------------------------------------------------------------------------------------------------------------------------+
    | PLAN FRAGMENT 0                                                                                                                                 |
    |   OUTPUT EXPRS:                                                                                                                                 |
    |     advertiser[#13]                                                                                                                             |
    |     channel[#14]                                                                                                                                |
    |     count(DISTINCT user_id)[#15]                                                                                                                |
    |   PARTITION: UNPARTITIONED                                                                                                                      |
    |                                                                                                                                                 |
    |   VRESULT SINK                                                                                                                                  |
    |                                                                                                                                                 |
    |   4:VEXCHANGE                                                                                                                                   |
    |      offset: 0                                                                                                                                  |
    |                                                                                                                                                 |
    | PLAN FRAGMENT 1                                                                                                                                 |
    |                                                                                                                                                 |
    |   PARTITION: HASH_PARTITIONED: mv_advertiser[#7], mv_channel[#8]                                                                                |
    |                                                                                                                                                 |
    |   STREAM DATA SINK                                                                                                                              |
    |     EXCHANGE ID: 04                                                                                                                             |
    |     UNPARTITIONED                                                                                                                               |
    |                                                                                                                                                 |
    |   3:VAGGREGATE (merge finalize)                                                                                                                 |
    |   |  output: bitmap_union_count(partial_bitmap_union_count(mva_BITMAP_UNION__to_bitmap_with_check(cast(user_id as BIGINT)))[#9])[#12]           |
    |   |  group by: mv_advertiser[#7], mv_channel[#8]                                                                                                |
    |   |  cardinality=1                                                                                                                              |
    |   |  projections: mv_advertiser[#10], mv_channel[#11], bitmap_union_count(mva_BITMAP_UNION__to_bitmap_with_check(cast(user_id as BIGINT)))[#12] |
    |   |  project output tuple id: 4                                                                                                                 |
    |   |                                                                                                                                             |
    |   2:VEXCHANGE                                                                                                                                   |
    |      offset: 0                                                                                                                                  |
    |                                                                                                                                                 |
    | PLAN FRAGMENT 2                                                                                                                                 |
    |                                                                                                                                                 |
    |   PARTITION: HASH_PARTITIONED: time[#3]                                                                                                         |
    |                                                                                                                                                 |
    |   STREAM DATA SINK                                                                                                                              |
    |     EXCHANGE ID: 02                                                                                                                             |
    |     HASH_PARTITIONED: mv_advertiser[#7], mv_channel[#8]                                                                                         |
    |                                                                                                                                                 |
    |   1:VAGGREGATE (update serialize)                                                                                                               |
    |   |  STREAMING                                                                                                                                  |
    |   |  output: partial_bitmap_union_count(mva_BITMAP_UNION__to_bitmap_with_check(cast(user_id as BIGINT))[#2])[#9]                                |
    |   |  group by: mv_advertiser[#0], mv_channel[#1]                                                                                                |
    |   |  cardinality=1                                                                                                                              |
    |   |                                                                                                                                             |
    |   0:VOlapScanNode                                                                                                                               |
    |      TABLE: default_cluster:test.advertiser_view_record(advertiser_uv), PREAGGREGATION: ON                                                      |
    |      partitions=1/1, tablets=10/10, tabletList=13531,13533,13535 ...                                                                            |
    |      cardinality=1, avgRowSize=2745.0, numNodes=1                                                                                               |
    |      pushAggOp=NONE                                                                                                                             |
    +-------------------------------------------------------------------------------------------------------------------------------------------------+
    49 rows in set (0.11 sec)

    EXPLAIN の結果では、まず OlapScanNode の rollup 属性値が advertiser_uv であることがわかります。これは、クエリがマテリアライズドビューから直接データをスキャンすることを示しており、照合が成功したことを確認できます。

    さらに、user_id フィールドについては、count(distinct)bitmap_union_count(to_bitmap) に書き換えられています。これは、クエリが Bitmap メソッドを使用して正確な重複排除を実現することを示しています。

よくある質問

  • Q: エラー: DATA_QUALITY_ERR: 「データ品質が要件を満たしていません。データを確認してください。」

    A: データ品質の問題またはスキーマの変更により、メモリ使用量が制限を超え、マテリアライズドビューの作成が失敗します。メモリの問題である場合は、memory_limitation_per_thread_for_schema_change_bytes パラメーターを増やしてください。

    重要
    • Bitmap 型は正の整数のみをサポートします。元のデータに負の数がある場合、マテリアライズドビューの作成は失敗します。

    • String 型のフィールドについては、bitmap_hash または bitmap_hash64 を使用してハッシュ値を計算し、ハッシュ値のビットマップを返すことができます。