同步物化视图
本文介绍如何在 StarRocks 中创建、使用以及管理同步物化视图(Rollup)。
同步物化视图下,所有对于基表的数据变更都会自动同步更新到物化视图中。您无需手动调用刷新命令,即可实现自动同步刷新物化视图 。同步物化视图的管理成本和更新成本都比较低,适合实时场景下单表聚合查询的透明加速。
StarRocks 中的同步物化视图仅能基于 Default Catalog 中的单个基表创建,是一种特殊的查询加速索引。
自 2.4 版本起,StarRocks 支持异步物化视图,可以基于多个基表创建,且支持更丰富的聚合函数。详细信息,请参阅 异步物化视图。
- 同步物化视图自 v3.1.8 起支持 WHERE 子句。
- 自 v3.4.0 起,StarRocks 存算分离集群支持同步物化视图。
下表从支持的特性角度比较了 StarRocks 2.5、2.4 中的异步物化视图以及同步物化视图(Rollup):
单表聚合 | 多表关联 | 查询改写 | 刷新策略 | 基表 | |
---|---|---|---|---|---|
异步物化视图 | 是 | 是 | 是 |
| 支持多表构建。基表可以来自:
|
同步物化视图(Rollup) | 仅部分聚合函数 | 否 | 是 | 导入同步刷新 | 仅支持基于 Default Catalog 的单表构建 |
相关概念
-
基表(Base Table)
物化视图的驱动表。
对于 StarRocks 的同步物化视图,基表仅可以是 Default catalog 中的单个内部表。StarRocks 支持在明细表、聚合表上创建同步物化视图。
-
刷新(Refresh)
StarRocks 同步物化视图中的数据将在数据导入基表时自动更新,无需手动调用刷新命令。
-
查询改写(Query Rewrite)
查询改写是指在对已构建了物化视图的基表进行查询时,系统自动判断是否可以复用物化视图中的预计算结果处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。
StarRocks 的同步物化视图支持部分聚合算子的查询改写。详细信息,请参见 聚合函数匹配关系。
准备工作
创建同步物化视图前,您需要检查数据仓库是否需要通过同步物化 视图加速查询。比如,您可以查看数据仓库中的查询是否重复使用特定子查询语句。
以下示例基于表 sales_records
,其中包含每笔交易的交易 ID record_id
、销售员 seller_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 命令查看此查询的 Query Profile。
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)