StarRocks物化视图

此章节介绍如何创建、使用和管理物化视图。

概述

StarRocks中的物化视图是一个特殊的物理表,它保存来自基表的预先计算的查询结果。一方面,当您对基表执行复杂查询时,可以在查询执行中直接使用相关的预计算结果,以避免重复计算并提高查询效率。另一方面,您可以通过物化视图基于数据仓库构建模型,为上层应用程序提供统一的数据规范,覆盖底层实现,或保护基表的原始数据安全。

基本概念

  • 物化视图

        您可以从两个角度理解物化视图:物化和视图。物化意味着存储和重用预先计算的结果以进行查询加速。视图本质上是基于其他表构建的表。它通常用于建立数学模型。

  • 基表

        基表是其物化视图的驱动表。

  • 查询重写

        查询重写意味着当对构建有物化视图的基表执行查询时,系统会自动判断预计算的结果是否可以在处理查询时重用。如果它们可以被重用,系统将直接从相关的物化视图加载数据,以避免耗时耗资源的计算或连接操作。

  • 刷新

        刷新是指当基表中的数据发生变化时,物化视图的数据同步。有两种通用的刷新策略:ON DEMAND刷新和ON COMMIT刷新。ON DEMAND是手动或定期触发的。每次基表中的数据更改时,都会触发ON COMMIT刷新。

使用场景分析

具体化视图在以下情况下很有用:

  • 查询加速 

物化视图很好地满足了加速可预测查询和重复使用相同子查询的查询的需要。通过物化视图,系统可以直接使用预先计算的中间查询结果集来处理此类查询。它显著降低了大量复杂查询所带来的负载压力,也大大缩短了查询处理时间。StarRocks基于物化视图实现透明加速,并确保在直接查询源表时,结果必须基于最新数据。

  • 数仓建模

通过物化视图,您可以基于一个或多个基表构建新表,以实现以下目标:

  • 结构化SQL语句,统一语义

您可以为上层应用程序提供统一的SQL语句结构和数据格式,以避免重复开发和计算。

  • 简单的接口

您可以覆盖底层实现,并确保上层应用程序接口的简单性。

  • 数据安全

您可以通过物化视图屏蔽基表的原始数据,以确保敏感数据的安全性。

使用举例

  • 使用重复聚合函数加速查询

假设数据仓库中的大多数查询都包含具有聚合函数的相同子查询,并且这些查询消耗了大量计算资源。基于此子查询,您可以创建一个物化视图,该视图将计算并存储子查询的所有结果。构建物化视图后,系统将重写包含子查询的所有查询,加载存储在物化视图中的中间结果,从而加速这些查询。

  • 多个表的常规JOIN

假设您需要定期连接数据仓库中的多个表以生成新的宽表。您可以为这些表构建一个物化视图,并设置一个异步刷新机制来定期触发构建,这样您就不必自己动手了。构建物化视图后,将直接从物化视图返回查询结果,从而避免了JOIN操作导致的延迟。

  • 数仓分层

假设您的数据仓库包含大量原始数据,其中的查询需要一组复杂的ETL操作。您可以构建多层物化视图来对数据仓库中的数据进行分层,从而将查询分解为一系列简单的子查询。它将显著减少重复计算,更重要的是,帮助DBA轻松高效地识别问题。除此之外,数据仓库分层有助于分离原始数据和统计数据,保护敏感原始数据的安全。

使用单表同步物化视图加速查询

StarRocks支持在单个表上创建同步刷新物化视图。

如果有大量的可预测查询或重复使用同一组子查询结果的查询,则可以构建物化视图来加速这些查询。

准备

在创建物化视图之前,请检查数据仓库是否符合通过物化视图进行查询加速的条件。例如,检查查询是否重用某些子查询语句。

以下示例基于sales_records表,其中包含每个交易的交易ID record_id、销售人员ID seller_id、商店ID store_id、日期sale_date和销售金额sale_amt。按照以下步骤创建表并将数据插入其中:

CREATE TABLE sales_records(
    record_id INT,
    seller_id INT,
    store_id INT,
    sale_date DATE,
    sale_amt BIGINT
) DISTRIBUTED BY HASH(record_id);

INSERT INTO sales_records
VALUES
    (001,01,1,"2022-03-13",8573),
    (002,02,2,"2022-03-14",6948),
    (003,01,1,"2022-03-14",4319),
    (004,03,3,"2022-03-15",8734),
    (005,03,3,"2022-03-16",4212),
    (006,02,2,"2022-03-17",9515);

本例的业务场景要求经常分析不同商店的销售额。因此,每个查询都使用sum函数,消耗了大量的计算资源。您可以运行查询以记录其时间,并使用EXPLAIN命令查看其查询配置文件。

MySQL > SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
+----------+-----------------+
| store_id | sum(`sale_amt`) |
+----------+-----------------+
|        2 |           16463 |
|        3 |           12946 |
|        1 |           12892 |
+----------+-----------------+
3 rows in set (0.02 sec)

MySQL > EXPLAIN SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
+-----------------------------------------------------------------------------+
| Explain String                                                              |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0                                                             |
|  OUTPUT EXPRS:3: store_id | 6: sum                                          |
|   PARTITION: UNPARTITIONED                                                  |
|                                                                             |
|   RESULT SINK                                                               |
|                                                                             |
|   4:EXCHANGE                                                                |
|                                                                             |
| PLAN FRAGMENT 1                                                             |
|  OUTPUT EXPRS:                                                              |
|   PARTITION: HASH_PARTITIONED: 3: store_id                                  |
|                                                                             |
|   STREAM DATA SINK                                                          |
|     EXCHANGE ID: 04                                                         |
|     UNPARTITIONED                                                           |
|                                                                             |
|   3:AGGREGATE (merge finalize)                                              |
|   |  output: sum(6: sum)                                                    |
|   |  group by: 3: store_id                                                  |
|   |                                                                         |
|   2:EXCHANGE                                                                |
|                                                                             |
| PLAN FRAGMENT 2                                                             |
|  OUTPUT EXPRS:                                                              |
|   PARTITION: RANDOM                                                         |
|                                                                             |
|   STREAM DATA SINK                                                          |
|     EXCHANGE ID: 02                                                         |
|     HASH_PARTITIONED: 3: store_id                                           |
|                                                                             |
|   1:AGGREGATE (update serialize)                                            |
|   |  STREAMING                                                              |
|   |  output: sum(5: sale_amt)                                               |
|   |  group by: 3: store_id                                                  |
|   |                                                                         |
|   0:OlapScanNode                                                            |
|      TABLE: sales_records                                                   |
|      PREAGGREGATION: ON                                                     |
|      partitions=1/1                                                         |
|      rollup: sales_records                                                  |
|      tabletRatio=10/10                                                      |
|      tabletList=12049,12053,12057,12061,12065,12069,12073,12077,12081,12085 |
|      cardinality=1                                                          |
|      avgRowSize=2.0                                                         |
|      numNodes=0                                                             |
+-----------------------------------------------------------------------------+
45 rows in set (0.00 sec)

可以观察到,查询大约需要0.02秒,并且没有使用物化视图来加速查询,因为从查询计划中可以看到rollup的值是sales_records,这是基表。

创建单个表物化视图

可以使用CREATE MATERIALIZED VIEW基于特定查询语句创建物化视图。

基于上面提到的表sales_records和查询语句,下面的示例创建物化视图store_amt,以分析每个商店中的销售金额总和。

CREATE MATERIALIZED VIEW store_amt AS
SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;

使用单表物化视图进行查询

你创建的物化视图包含根据查询语句预先计算的完整结果集。后续查询将使用其中的数据。现在你可以再次运行准备阶段的查询语句来测试查询时间。

MySQL > SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
+----------+-----------------+
| store_id | sum(`sale_amt`) |
+----------+-----------------+
|        2 |           16463 |
|        3 |           12946 |
|        1 |           12892 |
+----------+-----------------+
3 rows in set (0.01 sec)

可以看到查询时间已经减少到0.01秒。

检查查询是否命中物化视图

再次运行EXPLAIN命令以检查查询是否命中物化视图。

MySQL > EXPLAIN SELECT store_id, SUM(sale_amt) FROM sales_records GROUP BY store_id;
+-----------------------------------------------------------------------------+
| Explain String                                                              |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0                                                             |
|  OUTPUT EXPRS:3: store_id | 6: sum                                          |
|   PARTITION: UNPARTITIONED                                                  |
|                                                                             |
|   RESULT SINK                                                               |
|                                                                             |
|   4:EXCHANGE                                                                |
|                                                                             |
| PLAN FRAGMENT 1                                                             |
|  OUTPUT EXPRS:                                                              |
|   PARTITION: HASH_PARTITIONED: 3: store_id                                  |
|                                                                             |
|   STREAM DATA SINK                                                          |
|     EXCHANGE ID: 04                                                         |
|     UNPARTITIONED                                                           |
|                                                                             |
|   3:AGGREGATE (merge finalize)                                              |
|   |  output: sum(6: sum)                                                    |
|   |  group by: 3: store_id                                                  |
|   |                                                                         |
|   2:EXCHANGE                                                                |
|                                                                             |
| PLAN FRAGMENT 2                                                             |
|  OUTPUT EXPRS:                                                              |
|   PARTITION: RANDOM                                                         |
|                                                                             |
|   STREAM DATA SINK                                                          |
|     EXCHANGE ID: 02                                                         |
|     HASH_PARTITIONED: 3: store_id                                           |
|                                                                             |
|   1:AGGREGATE (update serialize)                                            |
|   |  STREAMING                                                              |
|   |  output: sum(5: sale_amt)                                               |
|   |  group by: 3: store_id                                                  |
|   |                                                                         |
|   0:OlapScanNode                                                            |
|      TABLE: sales_records                                                   |
|      PREAGGREGATION: ON                                                     |
|      partitions=1/1                                                         |
|      rollup: store_amt                                                      |
|      tabletRatio=10/10                                                      |
|      tabletList=12092,12096,12100,12104,12108,12112,12116,12120,12124,12128 |
|      cardinality=6                                                          |
|      avgRowSize=2.0                                                         |
|      numNodes=0                                                             |
+-----------------------------------------------------------------------------+
45 rows in set (0.00 sec)

可以看到,现在查询计划中rollup的值是store_amt,这是刚创建的物化视图名。这就说明已命中物化视图。

检查单个表物化视图的生成状态

创建单个表物化视图是一个异步操作。运行CREATE MATERIALIZED VIEW命令成功表明创建物化视图的任务已成功提交。您可以通过SHOW ALTER MATERIALIZED VIEW命令查看数据库中物化视图的构建状态。

MySQL > SHOW ALTER MATERIALIZED VIEW\G
*************************** 1. row ***************************
          JobId: 12090
      TableName: sales_records
     CreateTime: 2022-08-25 19:41:10
   FinishedTime: 2022-08-25 19:41:39
  BaseIndexName: sales_records
RollupIndexName: store_amt
       RollupId: 12091
  TransactionId: 10
          State: FINISHED
            Msg: 
       Progress: NULL
        Timeout: 86400
1 row in set (0.00 sec)

RollupIndexName是物化视图的名称,State是创建状态

检查物化视图的Schema

可以使用DESC tbl_name ALL命令检查表及其从属物化视图的Schema。

MySQL > DESC sales_records ALL;
+---------------+---------------+-----------+--------+------+-------+---------+-------+
| IndexName     | IndexKeysType | Field     | Type   | Null | Key   | Default | Extra |
+---------------+---------------+-----------+--------+------+-------+---------+-------+
| sales_records | DUP_KEYS      | record_id | INT    | Yes  | true  | NULL    |       |
|               |               | seller_id | INT    | Yes  | true  | NULL    |       |
|               |               | store_id  | INT    | Yes  | true  | NULL    |       |
|               |               | sale_date | DATE   | Yes  | false | NULL    | NONE  |
|               |               | sale_amt  | BIGINT | Yes  | false | NULL    | NONE  |
|               |               |           |        |      |       |         |       |
| store_amt     | AGG_KEYS      | store_id  | INT    | Yes  | true  | NULL    |       |
|               |               | sale_amt  | BIGINT | Yes  | false | NULL    | SUM   |
+---------------+---------------+-----------+--------+------+-------+---------+-------+
8 rows in set (0.00 sec)

删除物化视图

在以下情况下,需要删除物化视图:

  • 创建的物化视图是错误的,需要在其创建完成之前将其删除。
  • 创建了太多的物化视图,这会导致负载性能的大幅下降,并且一些物化视图是重复的。
  • 被使用的频率很低,同时可以容忍相对较高的查询延迟。

删除未创建完成的物化视图

通过取消正在进行的创建任务,可以删除正在创建的物化视图。首先,需要通过检查物化视图的构建状态来获取物化视图创建任务的作业ID JobID。获取作业ID后,需要使用CANCEL ALTER命令取消创建任务

CANCEL ALTER TABLE ROLLUP FROM sales_records (12090);

删除已经存在的物化视图

使用DROP MATERIALIZED VIEW命令删除现有的物化视图。

DROP MATERIALIZED VIEW store_amt;

最佳实践

剔重统计

以下示例基于广告业务分析表advertiser_view_record,该表记录了查看广告的日期click_time、广告的名称advertiser、广告的频道channel以及查看广告的用户的ID user_id。

CREATE TABLE advertiser_view_record(
    click_time DATE,
    advertiser VARCHAR(10),
    channel VARCHAR(10),
    user_id INT
) distributed BY hash(click_time);

分析集中看广告的人数。

SELECT advertiser, channel, count(distinct user_id)
FROM advertiser_view_record
GROUP BY advertiser, channel;

为了加速剔重统计,可以基于此表创建一个物化视图,并使用bitmap _union函数预聚合数据。

CREATE MATERIALIZED VIEW advertiser_uv AS
SELECT advertiser, channel, bitmap_union(to_bitmap(user_id))
FROM advertiser_view_record
GROUP BY advertiser, channel;

创建物化视图后,后续查询中的子查询计数 count(distinct user_id)将自动重写为bitmap_union_count (to_bitmap(user_id))

再次使用上面的表advertiser_view_record作为示例。为了加快近似计数的区分,可以基于此表创建一个物化视图,并使用hll_union()函数预聚合数据。

CREATE MATERIALIZED VIEW advertiser_uv2 AS
SELECT advertiser, channel, hll_union(hll_hash(user_id))
FROM advertiser_view_record
GROUP BY advertiser, channel;

设置额外排序关键字

假设基表表A包含列k1、k2和k3,其中只有k1和k2是排序键。如果包含k3=x的子查询的查询必须加速,则可以创建一个以k3为第一列的物化视图。

CREATE MATERIALIZED VIEW k3_as_key AS
SELECT k3, k2, k1
FROM tableA

聚合函数的对应关系

当使用物化视图执行查询时,原始查询语句将被自动重写,并用于查询存储在物化视图中的中间结果。下表显示了原始查询中的聚合函数与用于构造物化视图的聚合函数之间的对应关系。您可以根据业务场景选择相应的聚合函数来构建物化视图。

原查询语句的聚合函数物化视图中的聚合函数
sumsum
minmin
maxmax
countcount
bitmap_union, bitmap_union_count, count(distinct)bitmap_union
hll_raw_agg, hll_union_agg, ndv, approx_count_distincthll_union

以下情况物化视图不支持

  • 同步物化视图仅支持单个列上的聚合函数。不支持sum(a+b)形式的查询语句。
  • 同步物化视图创建语句中不支持JOIN和WHERE等子句。
  • 当前版本的StarRocks不支持同时创建多个物化视图。只有在创建完成之前的视图时,才能创建新的物化视图。
  • 物化视图只支持基表的每列有一个聚合函数。例如在同时出现sum(a)和min(a)等查询语句是不支持的。
  • 使用ALTER TABLE DROP COLUMN在基表中删除特定列时,需要确保基表的所有物化视图都包含删除的列,否则无法执行删除操作。如果必须删除该列,则需要首先删除不包含该列的所有物化视图,然后删除该列。
  • 为表创建过多的物化视图将影响数据加载效率。当数据加载到基表时,物化视图和基表中的数据将同步更新。如果基表包含n个物化视图,则将数据加载到基表的效率与将数据加载至n个表的效率大致相同。
  • 使用聚合函数时必须使用GROUP BY子句,并在SELECT列表中指定GROUP BY列。

具有多表异步物化视图的模型数据仓库

StarRocks 2.4支持为多个基表创建异步物化视图,以允许对数据仓库进行建模。异步物化视图支持所有数据模型。

对于当前版本,多表物化视图支持两种刷新策略:

  • 异步刷新

异步刷新策略允许物化视图通过异步刷新任务进行刷新,但不能保证基表与其从属物化视图之间的严格一致性。

  • 手动刷新

您可以手动触发异步物化视图的刷新任务。它不能保证基表与其从属物化视图之间的严格一致性。

准备

启用异步物化视图

要使用异步物化视图功能,需要使用以下语句将配置项enable_experimental_mv设置为true:

ADMIN SET FRONTEND CONFIG ("enable_experimental_mv"="true");

创建基表

以下示例涉及两个基表:

  • 表货物记录项目ID item_id1、项目名称item_name和项目价格price。
  • order_list表记录订单ID order_id、客户端ID client_id、项目ID item_id2和订单日期order_date。

列item_id1与列item_id2相同。

按照以下步骤创建表并将数据插入其中:

CREATE TABLE goods(
    item_id1          INT,
    item_name         STRING,
    price             FLOAT
) DISTRIBUTED BY HASH(item_id1);

INSERT INTO goods
VALUES
    (1001,"apple",6.5),
    (1002,"pear",8.0),
    (1003,"potato",2.2);

CREATE TABLE order_list(
    order_id          INT,
    client_id         INT,
    item_id2          INT,
    order_date        DATE
) DISTRIBUTED BY HASH(order_id);

INSERT INTO order_list
VALUES
    (10001,101,1001,"2022-03-13"),
    (10001,101,1002,"2022-03-13"),
    (10002,103,1002,"2022-03-13"),
    (10002,103,1003,"2022-03-14"),
    (10003,102,1003,"2022-03-14"),
    (10003,102,1001,"2022-03-14");

本例的业务场景要求对每个订单的总数进行频繁分析。因为每个查询都需要对两个基表执行JOIN操作,所以应该将两个基表格连接到一个宽表中。此外,业务场景要求每隔一天刷新一次数据。

查询语句如下:

SELECT
    order_id,
    sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;

创建异步刷新多表物化视图

可以使用CREATE MATERIALIZED VIEW基于特定查询语句创建物化视图。

基于上面提到的表goods、order_list和查询语句,下面的示例创建物化视图order_mv来分析每个订单的总数。物化视图设置为每隔一天异步刷新一次。

CREATE MATERIALIZED VIEW order_mv
DISTRIBUTED BY HASH(`order_id`) BUCKETS 
12

REFRESH ASYNC START('2022-09-01 10:00:00') EVERY (interval 
1
 day)
AS SELECT
    order_list.order_id,
    sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;

关于物化视图的异步刷新机制

在StarRocks v2.5中,多表异步刷新物化视图支持多种异步刷新机制。创建物化视图时,可以通过指定以下财产来设置不同的刷新机制,或者使用ALTER MATERIALIZED VIEW修改现有物化视图的机制。

属性默认值说明
partition_ttl_number-1要保留的最新物化视图分区数。分区数超过此值后,将删除过期的分区。StarRocks将根据FE配置项dynamic_partition_check_interval_seconds中指定的时间间隔定期检查物化视图分区,并自动删除过期的分区。当值为-1时,将保留物化视图的所有分区。
partition_refresh_number-1在一次刷新中,要刷新的最大分区数。如果要刷新的分区数超过此值,StarRocks将拆分刷新任务并分批完成。只有当上一批分区成功刷新时,StarRocks才会继续刷新下一批分区,直到所有分区都被刷新。如果任何分区未能刷新,则不会生成后续的刷新任务。当值为-1时,将不拆分刷新任务。
excluded_trigger_tablesAn empty string如果此处列出了物化视图的基表,则当基表中的数据发生更改时,不会触发自动刷新任务。此参数仅适用于加载触发的刷新策略,通常与属性auto_refresh_partitions_limit一起使用。格式:[db_name.]table_name。当值为空字符串时,所有基表中的任何数据更改都会触发相应物化视图的刷新。
auto_refresh_partitions_limit-1触发物化视图刷新时需要刷新的最新物化视图分区数。您可以使用此属性限制刷新范围并降低刷新成本。但是,由于并非所有分区都被刷新,因此物化视图中的数据可能与基表不一致。当值为-1时,将刷新所有分区。

关于嵌套物化视图

StarRocks v2.5支持创建嵌套的异步刷新物化视图。您可以基于现有的物化视图构建物化视图。每个物化视图的刷新策略仅适用于相应的物化视图。目前,StarRocks并不限制嵌套层数。在生产环境中,我们建议嵌套层数不超过三层。

关于外部catalog物化视图

StarRocks v2.5支持基于Hive catalog、Hudi catalog和Iceberg catalog创建异步刷新物化视图。创建外部catalog物化视图的方式与创建常规异步刷新物化视图相同,但有以下使用限制:

  • 外部目录物化视图仅支持异步固定间隔刷新和手动刷新。
  • 具体化视图和外部catalog中的基表之间不能保证严格的一致性。
  • 目前,不支持基于外部资源构建物化视图。
  • 目前,StarRocks无法感知外部catalog中的基表数据是否已更改,因此每次刷新基表时,默认情况下都会刷新所有分区。你只能使用REFRESH MATERIALIZED VIEW手动刷新部分分区。

使用物化视图进行查询

您创建的物化视图包含根据查询语句预先计算的完整结果集。您可以直接查询异步物化视图。

MySQL > SELECT * FROM order_mv;
+----------+--------------------+
| order_id | total              |
+----------+--------------------+
|    10001 |               14.5 |
|    10002 | 10.200000047683716 |
|    10003 |  8.700000047683716 |
+----------+--------------------+
3 rows in set (0.01 sec)

(可选)使用异步物化视图重写查询

在StarRocks v2.5中,多表异步刷新物化视图支持基于SPJG类型物化视图的自动透明查询重写。SPJG类型的物化视图是指其计划仅包括Scan、Filter、Project和Aggregate类型的运算符的物化的视图。SPJG型物化视图查询重写包括单表查询重写、联接查询重写、聚合查询重写、联合查询重写和基于嵌套物化视图的查询重写。

当查询内部表中的数据时,StarRocks通过排除数据与基表不一致的物化视图,确保重写的查询与原始查询之间的结果具有很强的一致性。当物化视图数据中的数据过期时,物化视图将不会用作候选物化视图。 

注意

目前,StarRocks不支持基于外部目录物化视图的查询重写。

查询重写的候选物化视图

在重写查询时,StarRocks会从所有物化视图中大致选择可能满足相应条件的候选物化视图,以降低重写成本。

候选物化视图必须满足以下条件:

  1. 物化视图状态为活动状态。
  2. 物化视图的基表与查询中涉及的表之间必须存在交集。
  3. 如果它是非分区的物化视图,则其中的数据必须是最新的。
  4. 如果是分区的物化视图,则只有大多数更新的分区才能用于查询重写。
  5. 物化视图只能包含Select、Filter、Join、Projection和Aggregate运算符。
  6. 如果嵌套的物化视图满足条件1、3和4,则它们也被视为候选视图。

启用基于异步物化视图的查询重写

StarRocks默认启用物化视图查询重写。可以通过会话变量enable_materialized_view_rewrite启用或禁用此功能。

SET GLOBAL enable_materialized_view_rewrite = { true | false };

基于异步物化视图配置查询重写

您可以通过以下会话变量配置异步物化视图查询重写:

变量默认值说明
enable_materialized_view_union_rewritetrue用于控制是否启用物化视图联合查询重写的布尔值。
enable_rule_based_materialized_view_rewritetrue用于控制是否启用基于规则的物化视图查询重写的布尔值。此变量主要用于单表查询重写。
nested_mv_rewrite_max_level3

可用于查询重写的嵌套物化视图的最大级别。类型:INT,范围:[1,+∞)。值1表示只有在基表上创建的物化视图才能用于查询重写。

检查查询是否被重写

通过使用EXPLAIN语句查看查询计划,可以检查是否基于物化视图重写了查询。如果OlapScanNode部分下的字段TABLE显示了相应的物化视图的名称,则表示查询已基于物化视图重写。

mysql> EXPLAIN SELECT order_id, sum(goods.price) as total FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2 GROUP BY order_id;
+------------------------------------+
| Explain String                     |
+------------------------------------+
| PLAN FRAGMENT 0                    |
|  OUTPUT EXPRS:1: order_id | 8: sum |
|   PARTITION: RANDOM                |
|                                    |
|   RESULT SINK                      |
|                                    |
|   1:Project                        |
|   |  <slot 1> : 9: order_id        |
|   |  <slot 8> : 10: total          |
|   |                                |
|   0:OlapScanNode                   |
|      TABLE: order_mv               |
|      PREAGGREGATION: ON            |
|      partitions=1/1                |
|      rollup: order_mv              |
|      tabletRatio=0/12              |
|      tabletList=                   |
|      cardinality=3                 |
|      avgRowSize=4.0                |
|      numNodes=0                    |
+------------------------------------+
20 rows in set (0.01 sec)

重命名物化视图

可以通过ALTER MATERIALIZED VIEW 命令重命名实体化视图。

ALTER MATERIALIZED VIEW order_mv RENAME order_total;

更改物化视图的刷新策略

通过ALTER MATERIALIZED VIEW命令更改实体化视图的刷新策略。

ALTER MATERIALIZED VIEW order_mv REFRESH ASYNC EVERY(INTERVAL 2 DAY);

检查物化视图

通过以下方式检查数据库中的物化视图:

显示数据库中的所有物化视图。

SHOW MATERIALIZED VIEW;

显示指定的物化视图。

SHOW MATERIALIZED VIEW WHERE NAME = order_mv;

模糊匹配显示特定的物化视图。

SHOW MATERIALIZED VIEW WHERE NAME LIKE "order%";

通过information_schema检查所有物化视图。

SELECT * FROM information_schema.materialized_views;

检查物化视图的定义

您可以通过SHOW CREATE MATERIALIZED VIEW命令检查用于创建物化视图的SQL语句。

SHOW CREATE MATERIALIZED VIEW order_mv;

手动刷新异步物化视图

通过REFRESH MATERIALIZED VIEW命令手动刷新异步物化视图。StarRocks v2.5支持指定要刷新的分区。

REFRESH MATERIALIZED VIEW order_mv;

 注意

您可以通过此命令使用异步或手动刷新策略刷新物化视图。但是,不能通过此命令刷新单个表同步刷新物化视图。

您可以使用 CANCEL REFRESH MATERIALIZED VIEW语句取消刷新任务。 

检查多表物化视图的执行状态

可以通过以下方式检查多表物化视图的执行状态。

SELECT * FROM INFORMATION_SCHEMA.tasks;
SELECT * FROM INFORMATION_SCHEMA.task_runs;

注意

异步刷新物化视图依赖于Task框架来刷新数据,因此您可以通过查询Task框架提供的任务和Task_runs元数据表来检查刷新任务。

 删除物化视图

可以通过 DROP MATERIALIZED VIEW命令删除实体化视图。

DROP MATERIALIZED VIEW order_mv;

注意

异步刷新物化视图具有以下功能:

  • 您可以直接查询异步刷新物化视图,但结果可能与基表的结果不一致。
  • 您可以为异步刷新物化视图设置不同于基表的分区和分块策略。
  • 异步刷新物化视图支持更长时间内的动态分区策略。例如,如果基表以一天的间隔分区,则可以将物化视图设置为以一个月的间隔分区。
  • 您可以在异步或手动刷新策略下构建多表物化视图。
  • 异步或手动刷新物化视图的分区键和桶键必须在查询语句中。
  • 查询语句不支持随机函数,包括rand()、random()、uuid()和sleep()。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值