全部產品
Search
文件中心

ApsaraDB for SelectDB:同步物化視圖

更新時間:Jun 17, 2025

當您需要最佳化重複且耗時較長的複雜查詢時,您可以使用ApsaraDB for SelectDB中的同步物化視圖功能來緩衝複雜查詢的資料,實現快速存取和高效資料處理。

功能介紹

同步物化視圖是根據定義好的SELECT語句預先計算的資料集,並儲存在SelectDB中一個特殊的表中。查詢時,會自動匹配到最優的同步物化視圖,並直接從同步物化視圖中讀取資料。同步物化視圖具有以下特點

  • 可縮短查詢回應時間

    同步物化視圖通過預存計算結果縮短查詢回應時間。

  • 自動同步機制無需人工維護資料

  • 資料即時與基表保持一致

    在資料插入、更新或刪除情境下,SelectDB可確保基表與同步物化視圖的強一致性,通過內建的累加式更新機制即時維護物化視圖資料有效性。

注意事項

  • 使用注意事項:

    • 不支援直接查詢。

      與非同步物化視圖不同,不能直接查詢同步物化視圖,即查詢語句仍然是查詢基表。當SelectDB接收到查詢語句後,其會根據查詢語句自動選擇一個最優的物化視圖,從物化視圖中讀取資料並計算。更多詳情,請參見查詢自動匹配

    • 在Unique模型上,不能通過建立同步物化視圖的方式對資料進行粗粒度彙總操作。

      因為同步物化視圖針對Unique資料模型,只能改變列順序,不能起到彙總的作用。

  • 效能影響單表上的同步物化視圖太多會影響資料匯入的效率。

    在匯入資料時,同步物化視圖和基表資料是同步更新的。

    例如:一張表建立的同步物化視圖表超過10張,則有可能導致匯入速度很慢。因為這相當於單次匯入需要同時向10張以上的表中匯入資料。

適用情境

  • 加速耗時的彙總運算。

  • 查詢需要匹配不同的首碼索引。

  • 通過預先過濾減少需要掃描的資料量。

  • 通過預先完成複雜的運算式計算來加速查詢。

建立物化視圖

建立原則

在建立物化視圖之前,首先需要根據查詢語句的特點確定建立物化視圖的類型。並不是物化視圖的定義和某個查詢語句完全一致就是最理想的情況。建立物化視圖有以下兩個原則。

  • 從查詢語句中抽象出多個查詢共有的分組和彙總方式,作為物化視圖的定義。

    一個抽象出來的物化視圖,如果能被多個查詢匹配到,說明該物化視圖的效果是最好的。因為維護物化視圖也需要消耗資源。如果該物化視圖只和某個特殊的查詢一致,而其他查詢均用不到這個物化視圖。這將導致該物化視圖的性價比不高,既佔用了叢集的儲存資源,同時也無法為被更多的查詢所使用。

  • 不需要為所有的維度組合都建立物化視圖。

    在實際的分析查詢中,並不會覆蓋到所有的維度分析。因此只需要給常用的維度組合建立物化視圖,便可以達到空間和時間上的平衡。

注意事項

  • SELECT語句

    • 僅支援基於單表的SELECT語句

    • SELECT列禁止包含自增列、常量、重複表格達式及視窗函數。

    • 如果SELECT列包含了建立表的分區列和分桶列,那麼這些列必須作為物化視圖中的Key列。

  • 子句

    允許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函數僅在以下兩種情況支援建立物化視圖:

      • 使用格式為BITMAP_UNION(TO_BITMAP(COLUMN))時,其列(COLUMN)的類型只能是除了largeint類型的整數。

      • 使用格式為BITMAP_UNION(COLUMN)時,其基表必須為Aggregate模型。

    • HLL_UNION函數僅在以下兩種情況支援建立物化視圖:

      • 使用格式為HLL_UNION(HLL_HASH(COLUMN))時,其列(COLUMN)的類型不能是DECIMAL

      • 使用格式為HLL_UNION(COLUMN)時,其基表必須為Aggregate模型。

文法

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

參數說明

參數名稱

是否必填

參數說明

mv_name

同步物化視圖的名稱。相同基表的物化視圖名稱不可重複。

query

用於構建同步物化視圖的查詢語句。

查詢語句的結果即物化視圖中的資料。具體參見query參數說明如下。

properties

聲明物化視圖的相關配置。格式如下。

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

以下配置,可以在該屬性中定義。

short_key:排序列的個數。 
timeout:物化視圖構建的逾時時間。

query參數說明如下。

目前支援的query格式如下。

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

參數說明如下。

參數名稱

是否必填

參數說明

select_expr

同步物化視圖結構(Schema)中所有的列。至少包含一個單列。

base_view_name

同步物化視圖的基表。必須是單表,且非子查詢。

group by

同步物化視圖的分組列。不填則資料不進行分組。

order by

同步物化視圖的排序。

  • 排序列的聲明順序必須和select_expr中列聲明順序一致。

  • 如果不聲明order by,則根據規則自動補充排序列。

    • 如果同步物化視圖是彙總類型,則所有的分組列自動補充為排序列。

    • 如果同步物化視圖是非彙總類型,則前36個位元組自動補充為排序列。

    • 如果自動補充的排序個數小於3個,則前三個作為排序列。

    • 如果query中包含分組列的話,則排序列必須和分組列一致。

樣本

  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;

      物化視圖的結構(Schema)如下,物化視圖僅包含兩列k1,k2且不帶任何彙總。

      +-----------------+-------+--------+------+------+---------+-------+
      | 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;

      物化視圖的結構(Schema)如下,物化視圖僅包含兩列k2,k1,其中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;

      物化視圖的結構(Schema)如下,包含兩列k1,k2,sum(k3)。其中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,以及它的表結構。

刪除物化視圖

如果不需要同步物化視圖,可以通過命令刪除或者取消建立物化視圖。

  • 刪除建立未完成的物化視圖

    如果您希望取消未完成建立的物化視圖,可以通過以下命令取消。

    文法

    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資訊,請參見查詢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

其中bitmaphll的彙總函式在查詢匹配到物化視圖後,查詢的彙總運算元將根據物化視圖的表結構進行重寫。

完整使用樣本

物化視圖的使用分為以下三個步驟。

  1. 建立物化視圖。

  2. 非同步檢查物化視圖是否構建完成。

  3. 查詢並自動匹配物化視圖。

樣本背景

例如業務情境是計算廣告的PV和UV,原始廣告點選資料存放區在SelectDB,因此廣告PV,UV查詢就可以通過建立彙總類型為bitmap_union的物化視圖來提升查詢速度。

準備工作:設計基表

建立一個儲存廣告點選資料明細的表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,所以如果查詢中涉及到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中需要先將欄位通過函數to_bitmap轉換為bitmap類型,然後才可以進行bitmap_union彙總。

    建立物化視圖完成後查詢廣告點選明細表的物化視圖和它的表結構,樣本如下。

     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)

步驟二:檢查視圖是否構建完成

通過命令查看物化視圖建立狀態,當狀態為FINISHED時,物化視圖已經建立成功。

步驟三:查詢自動匹配

  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:"The data quality does not satisfy, please check your data."

    A:由於資料品質問題或者Schema變更,使得記憶體使用量超出限制,導致物化視圖建立失敗。如果是記憶體問題,調大memory_limitation_per_thread_for_schema_change_bytes參數即可。

    重要
    • Bitmap類型僅支援正整型,如果未經處理資料中存在負數,會導致物化視圖建立失敗。

    • String類型的欄位可使用bitmap_hash或bitmap_hash64計算Hash值,並返回Hash值的bitmap。