同步物化视图

当您需要优化重复且耗时的查询操作时,云数据库 SelectDB 版中的同步物化视图可以帮助您缓存复杂查询,实现快速访问和高效数据处理。

功能介绍

同步物化视图是根据定义好的SELECT语句预先计算的数据集,并存储在SelectDB中一个特殊的表中。查询时,会自动匹配到最优的同步物化视图,并直接从同步物化视图中读取数据。同步物化视图具有以下特点

  • 可缩短查询响应时间

    同步物化视图通过预存计算结果缩短查询响应时间。

  • 自动同步机制无需人工维护数据

  • 数据实时与基表保持一致

    在数据插入、更新或删除场景下,SelectDB可确保基表与同步物化视图的强一致性,通过内置的增量更新机制实时维护物化视图数据有效性。

注意事项

  • 使用注意事项:

    • 不支持直接查询。

      与异步物化视图不同,不能直接查询同步物化视图,即查询语句仍然是查询基表。当SelectDB接收到查询语句后,其会根据查询语句自动选择一个最优的物化视图,从物化视图中读取数据并计算。更多详情,请参见查询自动匹配

    • Unique模型上,不能通过创建同步物化视图的方式对数据进行粗粒度聚合操作。

      因为同步物化视图针对Unique数据模型,只能改变列顺序,不能起到聚合的作用。

  • 性能影响单表上的同步物化视图太多会影响数据导入的效率。

    在导入数据时,同步物化视图和基表数据是同步更新的。

    例如:一张表创建的同步物化视图表超过10张,则有可能导致导入速度很慢。因为这相当于单次导入需要同时向10张以上的表中导入数据。

适用场景

  • 加速耗时的聚合运算。

  • 查询需要匹配不同的前缀索引。

  • 通过预先过滤减少需要扫描的数据量。

  • 通过预先完成复杂的表达式计算来加速查询。

创建物化视图

创建原则

在创建物化视图之前,首先需要根据查询语句的特点确定创建物化视图的类型。并不是物化视图的定义和某个查询语句完全一致就是最理想的情况。创建物化视图有以下两个原则。

  • 从查询语句中抽象出多个查询共有的分组和聚合方式,作为物化视图的定义。

    一个抽象出来的物化视图,如果能被多个查询匹配到,说明该物化视图的效果是最好的。因为维护物化视图也需要消耗资源。如果该物化视图只和某个特殊的查询一致,而其他查询均用不到这个物化视图。这将导致该物化视图的性价比不高,既占用了集群的存储资源,同时也无法为被更多的查询所使用。

  • 不需要为所有的维度组合都创建物化视图。

    在实际的分析查询中,并不会覆盖到所有的维度分析。因此只需要给常用的维度组合创建物化视图,便可以达到空间和时间上的平衡。

注意事项

  • SELECT语句

    • 仅支持基于单表SELECT语句

    • SELECT列禁止包含自增列、常量、重复表达式及窗口函数。

    • 如果SELECT包含了创建表的分区列和分桶列,那么这些列必须作为物化视图中的Key列。

  • 子句

    允许WHERE、GROUP BY、ORDER BY子句,但禁止使用JOIN、HAVING、LIMITLATERAL 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. 查询并自动匹配物化视图。

示例背景

例如业务场景是计算广告的PVUV,原始广告点击数据存储在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的结果中,首先可以看到OlapScanNoderollup属性值为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_hashbitmap_hash64计算Hash值,并返回Hash值的bitmap。