繰り返し発生する時間のかかる複雑なクエリを最適化する必要がある場合、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 | いいえ | マテリアライズドビューの関連構成を宣言します。フォーマットは次のとおりです。 このプロパティでは、次の構成を定義できます。 |
クエリパラメーターの説明は次のとおりです。
現在サポートされているクエリフォーマットは次のとおりです。
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 | いいえ | 同期マテリアライズドビューのソート。
|
例
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. 同期マテリアライズドビューを作成します。
元のテーブルの (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_k2、k2_order、k1_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
はい
削除するマテリアライズドビューのベーステーブル。
例
ベーステーブル
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` | | +-----------------+---------------+-------+--------+--------------+------+------+---------+-------+---------+------------+-------------+ベーステーブル
duplicate_tableからk1_k2という名前のマテリアライズドビューを削除します。DROP MATERIALIZED VIEW k1_k2 ON duplicate_table;マテリアライズドビューを削除した後、ベーステーブル
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 |
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+結果の説明は次のとおりです。
フィールド名 | 説明 |
| マテリアライズドビューデータのソーステーブルを指します。 |
| ベーステーブル名。 |
| マテリアライズドビューの名前。 |
| タスクのステータス。
State が FINISHED になると、マテリアライズドビューは正常に作成されています。 |
文の表示
コマンドを使用して、マテリアライズドビューの作成に使用された文を表示します。
構文
この構文では、すでに削除されたマテリアライズドビューをクエリすることはできません。
SHOW CREATE MATERIALIZED VIEW <mv_name> ON <table_name>パラメーターの説明
パラメーター名 | 必須 | 説明 |
mv_name | はい | マテリアライズドビューの名前。 |
table_name | はい | マテリアライズドビューのベーステーブル。 |
例
次の作成文でサンプルのマテリアライズドビューを準備します。
CREATE MATERIALIZED VIEW id_col1 AS SELECT id,col1 FROM table3;作成されたマテリアライズドビューの作成文を以下のように表示します。
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 つのステップが含まれます。
マテリアライズドビューを作成します。
マテリアライズドビューの構築が完了したかどうかを非同期で確認します。
マテリアライズドビューをクエリし、自動的に照合します。
例の背景
たとえば、広告の 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: マテリアライズドビューの作成
設計分析。
広告の 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_countはbitmap_unionの結果をカウントすることに等しいです。したがって、クエリにcount(distinct)が含まれる場合、bitmap_union集約を使用してマテリアライズドビューを作成することでクエリ速度を高速化できます。この場合、広告とチャネルでグループ化し、user_id列で正確な重複排除を行うマテリアライズドビューを作成できます。マテリアライズドビューを作成します。
上記の分析に基づいて、広告とチャネルでグループ化し、
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: クエリの自動照合
クエリ文を実行します。
マテリアライズドビューテーブルが作成されると、広告 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;クエリがマテリアライズドビューを使用しているかどうかを確認します。
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 を使用してハッシュ値を計算し、ハッシュ値のビットマップを返すことができます。