當您需要最佳化重複且耗時較長的複雜查詢時,您可以使用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 | 否 | 聲明物化視圖的相關配置。格式如下。 以下配置,可以在該屬性中定義。 |
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 | 否 | 同步物化視圖的排序。
|
樣本
準備樣本基表。
建立樣本表
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 | | +-------+--------+------+------+---------+-------+建立同步物化視圖。
建立一個僅包含原始表(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_k2,k2_order和k1_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
是
待刪除的物化視圖的基表。
樣本
查看基表
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資訊,請參見查詢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的彙總函式在查詢匹配到物化視圖後,查詢的彙總運算元將根據物化視圖的表結構進行重寫。
完整使用樣本
物化視圖的使用分為以下三個步驟。
建立物化視圖。
非同步檢查物化視圖是否構建完成。
查詢並自動匹配物化視圖。
樣本背景
例如業務情境是計算廣告的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)步驟一:建立物化視圖
設計分析。
查詢廣告的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進行精確去重的物化視圖。建立物化視圖。
基於上述分析,建立一個根據廣告和渠道分組,對
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時,物化視圖已經建立成功。
步驟三:查詢自動匹配
執行查詢語句。
當物化視圖表建立完成後,查詢廣告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:"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。