第6.2 章:StarRocks查询加速——视图和物化视图

目录

一、视图

1.1 视图定义

1.2 视图优势

1.3 视图创建

二、物化视图

2.1 概述

2.2 同步物化视图(Rollup)

2.2.1 概述

2.2.2 应用案例

2.3 异步物化视图

2.3.1 概述

2.3.2 引入背景

2.3.3 使用场景

2.3.4 同步vs异步

2.3.5 应用案例

注:本篇文章阐述的是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 分析语句执⾏预计算,并将计算结果持久化到另一张对用户透明但有实际存储的表中。在需要同时查询聚合数据和明细数据以及匹配不同前缀索引的场景,命中物化视图时可以获得更快的查询相应,同时也避免了大量的现场计算,因此可以提高性能表现并降低资源消耗。

  物化视图的官网地址:

同步物化视图 | StarRocks

异步物化视图 | StarRocks

2.2 同步物化视图(Rollup)

2.2.1 概述

    同步物化视图,所有对于基表的数据变更都会自动同步更新到物化视图中,不需要手动调用刷新命令。同步物化视图适合实时场景下的单表聚合查询的透明加速。

StarRocks 中的同步物化视图仅能基于单个基表创建,是一种特殊的查询加速索引(本质就是基表的一种索引)

    相关概念有:

  • 基表(Base Table)

     物化视图的驱动表,StarRocks 支持在明细表、聚合表和更新表上创建同步物化视图。

  • 刷新(Refresh)

      StarRocks同步物化视图中的数据将在数据导入基表时自动更新,无需手动调用刷新命令。

  • 查询改写(Query Rewrite)

      查询改写是指在已构建了物化视图的基表尽心进行查询时,系统自动判断是否可以复用物化视图中预计算结果的处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。StarRocks的同步物化视图支持部分聚合算子的查询改写。

2.2.2 应用案例

   以下是基于官网案例的实践操作

同步物化视图 | StarRocks

(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

  • 使用物化视图加速数据湖查询

使用物化视图加速数据湖查询 | StarRocks

注:参考文章:

StarRocks 如何借助物化视图加速数据分析

StarRocks的物化视图_starrocks 物化视图-CSDN博客

应用实践|Apache Doris物化视图与索引在京东的典型应用-腾讯云开发者社区-腾讯云

微信基于 StarRocks 的湖仓一体实践

第2.8章:StarRocks表设计--物化视图_starrocks rollup-CSDN博客

https://docs.starrocks.io/zh/docs/using_starrocks/Materialized_view-single_table/

第2.7章:StarRocks表设计--视图_starrocks视图-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值