StarRocks查询性能优化--Runtime Filter

前言

在众多OLAP数据库设计中,设计者都比较重视SQL的JOIN效率以支持用户更好的实现业务,作为新一代极速全场景MPP数据库,StarRocks中针对JOIN性能提升做出的优化设计之一就是Runtime Filter。

一.什么是Runtime Filter

Runtime Filter(下文中简称RF)是在运行时对数据进行过滤,过滤通常发生在Join阶段。当多表进行Join时,往往伴随着谓词下推等优化手段进行数据过滤,以减少Join的表的数据的扫描以及shuffle等阶段会产生的IO,从而提升查询性能。RF的优化方式同样也是会对数据进行过滤,但是无需用户进行设置,sql引擎会在查询时自动进行过滤优化。

RF的具体实现原理是当多表进行Join关联查询时,例如查询 a right join b on a.aid=b.bid where a.score >20,会先对其中a表进行谓词下推条件过滤,得到符合条件的数据,数据中包含a.aid集合,a表和b表通过a.aid和b.bid进行关联,将得到的a.aid作为过滤条件过滤,根据b.bid in a.id对b表进行数据过滤(实际实现in的方式有多种设计,例如可以通过bloomfilter进行过滤),以实现减少对b表数据扫描量,减少数据传输网络IO的目的,具体减少磁盘IO,网络IO取决于RF的设计方案。通常应用在大小表关联的情景,并且先对小表进行条件过滤,然后使用过滤后的数据通过join条件对大表中的数据进行数据裁剪。

上述场景中小表我们称为build side(构造侧),大表我们称为probe side(探查侧)。 RF的原理可简单描述为:根据build side的数据特征和分布,来对probe side进行数据裁剪。通过减少probe side在 scan 和 shuffle 两个阶段的IO,从而达到缩短运行时间的目的。

二.StarRocks中的Runtime Filter

1.StarRocks中Runtime Filter的简单应用示例:

StarRocks中进行Join,支持使用RF的类型: INNER JOIN , RIGHT OUTER JOIN , LEFT SEMI JOIN , RIGHT SEMI JOIN , RIGHT ANTI JOIN

如图所示,Fact和Dim两个表通过id字段join,左图表示的是未优化的时候,左表需要扫描10亿行的数据,而优化后只需要扫描100万行,减少大量的数据扫描,极大提升查询效率。这里的实现就是Runtime Filter,就是在sql运行过程中,将右表查询结果建一个 bloom filter 下推到左表,可以达到提前过滤的效果。 当前支持broadcast和shuffle runtime filter ,整个过程是自动优化的。

2.StarRocks中的两种RF

StarRocks中有两种RF,分别是Local RF和Global RF。

Local RF:

应用于broadcast hash join 的场景。Local RF的特点是生成时即为 全量的RF, 无需聚合,根据build side(小表)可以得到完整的RF。因为broadcast hash join 会将小表广播,每个节点拥有小表全量数据,因此根据小表可以生成完整RF,然后将RF下推到probe节点以及更下层scan节点。

在broadcast join过程中,join节点和probe节点属于一个fragment(同一线程中),在运行probe side之前,它会确保build side已经执行完成,拿到了build side的所有数据。

Global RF

应用于shuffle join的场景中,shuffle join会将数据进行打散,那么每个join节点的build side只有部分数据,只能生成部分RF,需要将每个partitioned build side得到的RF聚合起来,才能下推到probe side。

下推还有个问题,就是shuffle join的时候,join节点和probe节点(下层产生数据的scan node)已经不再一个fragment上了。生成的RF必须通过其他节点,才能真正地推送到probe节点(下层产生数据的scan node)上。针对这点,SR通过设计进行解决,这里不过多描述。

三.StarRocks中什么时候会创建Runtime Filter

  1. 右表如果数量小于 runtime_join_filter_push_down_limit (默认1024000单元行),那么会创建local runtime filter。

  2. 如果规划的时候发现右表过滤度在左表上可以达到50%,并且右表数量不能超过64M, 会创建global runtime filter。

四.通过profile分析

开启profile后,在其中搜索“JoinRuntimeFilterime”,如有此参数代表Runtime Filter进行下推了。profile开启方式获取Profile,通过Profile分析查询瓶颈
image