当您需要优化重复且耗时的查询操作时,云数据库 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。