目录
注:本篇文章阐述的是StarRocks-3.2版本的物化视图相关内容。
一、视图
1.1 视图定义
StarRocks也拥有视图功能,且其与MySQL中的视图概念及语法非常类似。StarRocks中的视图也是一种虚拟存在的表,其行和列的数据来自定义视图查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。
1.2 视图优势
- 重用sql语句;
- 简化复杂的sql操作,不必知道它的查询细节;
- 保护数据,提高安全性。
1.3 视图创建
创建视图的语法与MySQL的语法基本一致:
#创建视图的语法
create view view_name as select_statement;
#1.创建视图的例子
create view myv1 as
select device_code,
device_price,
total
from table01 a
join table02 b
on a.user_id = b.user_id;
#2.查询视图的例子
select * from myv1;
#3.修改视图的语法
alter view view_name
As select_statement;
#修改视图的例子
alter view myv1 as
select device_code,
device_price,
total
from table01 a
join table02 b
on a.user_id = b.user_id
limit 1;
#删除视图
drop view [if exists] myv1;
#查询视图的定义
show create view myv1;
二、物化视图
2.1 概述
物化视图是在基表之上构建的查询逻辑并将结果持久化存储。在StarRocks中,物化视图对于用户来说是透明的(用户无感知),即用户发生查询的时候,不需要指定物化视图的名称,而是直接查询基表,StarRocks 会决定是否从物化视图读取数据。
物化视图的作用:能针对特定业务的查询(聚合)需求,在基础表(原始数据表)基础上,通过业务聚合(或筛选)逻辑,提供一种以存储空间换取查询效率的数据解决方案。
另一种解释:物化视图是一种典型的空间换时间的思路,其本质是根据预定义的SQL 分析语句执⾏预计算,并将计算结果持久化到另一张对用户透明但有实际存储的表中。在需要同时查询聚合数据和明细数据以及匹配不同前缀索引的场景,命中物化视图时可以获得更快的查询相应,同时也避免了大量的现场计算,因此可以提高性能表现并降低资源消耗。
物化视图的官网地址:
2.2 同步物化视图(Rollup)
2.2.1 概述
同步物化视图,所有对于基表的数据变更都会自动同步更新到物化视图中,不需要手动调用刷新命令。同步物化视图适合实时场景下的单表聚合查询的透明加速。
StarRocks 中的同步物化视图仅能基于单个基表创建,是一种特殊的查询加速索引(本质就是基表的一种索引)。
相关概念有:
- 基表(Base Table)
物化视图的驱动表,StarRocks 支持在明细表、聚合表和更新表上创建同步物化视图。
- 刷新(Refresh)
StarRocks同步物化视图中的数据将在数据导入基表时自动更新,无需手动调用刷新命令。
- 查询改写(Query Rewrite)
查询改写是指在已构建了物化视图的基表尽心进行查询时,系统自动判断是否可以复用物化视图中预计算结果的处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。StarRocks的同步物化视图支持部分聚合算子的查询改写。
2.2.2 应用案例
以下是基于官网案例的实践操作
(1)使用普通的聚合函数
explain select store_id, sum(sale_amt)
from sales_records
group by store_id;
PLAN FRAGMENT 0
OUTPUT EXPRS:3: store_id | 6: sum
PARTITION: UNPARTITIONED
RESULT SINK
3:EXCHANGE
PLAN FRAGMENT 1
OUTPUT EXPRS:
PARTITION: HASH_PARTITIONED: 3: store_id
STREAM DATA SINK
EXCHANGE ID: 03
UNPARTITIONED
2:AGGREGATE (update finalize)
| output: sum(5: sale_amt)
| group by: 3: store_id
|
1:EXCHANGE
PLAN FRAGMENT 2
OUTPUT EXPRS:
PARTITION: RANDOM
STREAM DATA SINK
EXCHANGE ID: 01
HASH_PARTITIONED: 3: store_id
0:OlapScanNode
TABLE: sales_records
PREAGGREGATION: ON
partitions=1/1
rollup: sales_records
tabletRatio=6/6
tabletList=103053697,103053701,103053705,103053709,103053713,103053717
cardinality=6
avgRowSize=12.0
numNodes=0
得到上述 Query Profile 中的 rollup
项显示为 sales_records
(即基表),说明该查询未使用物化视图加速。
(2)使用物化视图
- 创建物化视图
#CREATE MATERIALIZED VIEW 语句为特定查询语句创建物化视图。
CREATE MATERIALIZED VIEW store_amt AS
SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id;
- 查看同步物化视图构建状态
SHOW ALTER MATERIALIZED VIEW
- 使用同步物化视图改写加速查询
新建的同步物化视图会预计算并保存上述查询的结果,后续查询(执行相同sql逻辑)将直接调用该结果以加速查询。
select store_id, sum(sale_amt)
from sales_records
group by store_id;
- 验证查询是否命中同步物化视图
explain select store_id, sum(sale_amt)
from sales_records
group by store_id;
PLAN FRAGMENT 0
OUTPUT EXPRS:3: store_id | 7: 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(7: 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(6: mv_sum_sale_amt)
| group by: 3: store_id
|
0:OlapScanNode
TABLE: sales_records
PREAGGREGATION: ON
partitions=1/1
rollup: store_amt
tabletRatio=6/6
tabletList=103053920,103053924,103053928,103053932,103053936,103053940
cardinality=6
avgRowSize=5.0
numNodes=0
此时 Query Profile 中的 rollup
项显示为 store_amt
(即同步物化视图),说明该查询已命中同步物化视图。
- 查看同步物化视图的表结构
#可以通过DESC <tbl_name> ALL命令查看特定表的表结构和其下属所有同步物化视图。
DESC sales_records ALL;
-
删除同步物化视图
#删除已创建的同步物化视图
DROP MATERIALIZED VIEW store_amt;
2.3 异步物化视图
2.3.1 概述
异步物化视图是一种特殊的物理表,其中存储了基于基表特定查询语句的预计算结果。当对基表执行复杂查询时,StarRocks 可以直接复用预计算的结果,避免重复计算,进而提高查询性能。查询的频率越高越复杂,使用异步物化视图带来的性能提升会越明显。
相比较于同步物化视图,异步物化视图支持多表关联以及更加丰富的聚合算子。异步物化视图可以通过手动调用或定时任务的方式刷新,并且支持刷新部分分区,可以大幅度刷新成本。此外,异步物化视图还支持多种查询改写场景,实现自动、透明的查询加速。
2.3.2 引入背景
数仓统计分析经常会基于多个大表执行复杂查询,即通常涉及多表之间数十亿数据的关联和聚合。此类复杂查询通常会造成大量的系统性能消耗。为此可以使用异步物化视图来解决。
相关概念有:
- 基表(Base Table)
异步物化视图的驱动表,对于StarRocks的异步物化视图,基表可以是内部表、外部数据目录中的表,已有的异步物化视图等。StarRocks支持在明细表、聚合表、更新表和主键表上创建异步物化视图。
- 刷新(Refresh)
创建异步物化视图后,其中的数据仅反映创建时刻的基表状态。当基表中的数据发生变化时,需要通过刷新异步物化视图来更新数据变化。
目前StarRocks支持两种异步刷新策略:
- async:异步刷新,每当基表中的数据发生变化时,物化视图根据指定的刷新间隔,自动触发刷新任务
- manual:手动触发刷新。物化视图不会自动刷新,需要用户手动维护刷新任务。
- 查询改写(Query Rewrite)
查询改写是指在已构建了物化视图的基表尽心进行查询时,系统自动判断是否可以复用物化视图中预计算结果的处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。
2.3.3 使用场景
- 加速重复集合查询
如果数仓存在大量包含相同聚合函数子查询的查询,占用了大量计算资源,可以基于该子查询来建立异步物化视图,计算并保存该子查询的所有结果。建立成功后,系统将自动改写查询语句,直接查询异步物化视图中的中间结果,从而降低负载,加速查询。
- 周期性多表关联查询
如果需要定期将数据仓库中多张表关联,生成一张新的宽表,可以为这些表建立异步物化视图,并设定定期刷新规则,从而避免手动调度关联任务。异步物化视图建立成功后,查询将直接基于异步物化视图返回结果,从而避免关联操作带来的延迟。
- 数仓分层
如果基表中包含大量原始数据,查询需要进行复杂的ETL操作,可以通过对数据建立多层异步物化视图实现数仓分层,由此将复杂查询分解为多层简单查询,即可以减少重复计算,
又能快速定位问题。除此之外,数仓分层还可以将原始数据与统计数据解耦,从而保护敏感性原始数据。
2.3.4 同步vs异步
同步物化视图(Rollup)可以提供更好的数据新鲜度和更低的刷新成本。但是同步物化视图在场景上有诸多限制,只可基于单一基表创建,且仅支持有限的聚合算子。异步物化视图可以基于多个基表创建,且支持更丰富的聚合算子。
从特性角度对比异步以及同步物化视图
2.3.5 应用案例
- 使用物化视图进行数据建模
使用方式见官网:
- 物化视图查询改写
使用方式见官网:
- 使用物化视图加速数据湖查询
注:参考文章:
StarRocks的物化视图_starrocks 物化视图-CSDN博客
应用实践|Apache Doris物化视图与索引在京东的典型应用-腾讯云开发者社区-腾讯云
第2.8章:StarRocks表设计--物化视图_starrocks rollup-CSDN博客
https://docs.starrocks.io/zh/docs/using_starrocks/Materialized_view-single_table/