算子

更新时间:

AnalyticDB for MySQL中的一个算子负责完成一个基本的数据处理逻辑,合理地组合算子、优化算子的顺序和执行方式,可以提升数据的处理效率。本文介绍AnalyticDB for MySQL中的常用算子及算子所对应的属性。

背景信息

AnalyticDB MySQL版中的一个算子负责完成一个基本的数据处理逻辑,一组算子按照执行计划完成数据的一组处理规则。AnalyticDB MySQL版是一个分布式系统,大多数算子可以达到在多个节点上并行完成计算任务,来提高数据处理效率。

您可以通过AnalyticDB MySQL版的SQL诊断功能查看具备属性的算子以及算子级别的结果诊断。更多详情,请参见算子层计划执行树算子级别诊断结果

说明

只有部分算子具备属性。

Aggregation

AnalyticDB MySQL版是一个分布式数据库,支持多节点并行完成聚合操作(更多关于聚合和分组聚合的信息,请参见分组聚合查询优化)。Aggregation算子通过sum()count()avg()等函数对数据进行聚合或分组聚合操作。

Aggregation算子包含了以下属性。

属性

说明

GroupByKeys

分组字段。

AggregationFunctions

使用的聚合函数,例如sum()count()avg()等。

说明

如果SELECT字段没有出现在GROUP BY子句中,也没有使用任何其他聚合函数,则系统会自动调用arbitrary()函数随机选取分组中的一个值输出。更多详情,请参见ARBITRARY

Step

当前聚合所处的阶段,取值如下:

  • PARTIAL:局部聚合。

  • FINAL:最终聚合。

  • SINGLE:单步聚合,即直接执行最终聚合。

DistinctLimit

对应SQL语句中的DISTINCT LIMIT操作。

Filter

AnalyticDB MySQL版支持两种数据过滤过程:

  • 数据源过滤:使用存储层数据的索引进行过滤。

    说明

    没有独立的算子用于表示数据源过滤过程,该过程中的过滤条件会体现在TableScan算子中。关于TableScan算子的详情,请参见TableScan

  • 非数据源过滤:存储层数据没有索引,需要在计算层使用Filter算子进行过滤。

AnalyticDB MySQL版默认对所有字段创建了索引,但在如下场景中不会将过滤条件下推:

  • 查询语句中使用了no_index_columnsfilter_not_pushdown_columnsHint,或集群使用了adb_config filter_not_pushdown_columns配置,导致过滤条件下推功能被关闭。
  • 过滤条件中使用了函数(包括cast操作符)。
  • 过滤条件中的相关字段没有索引(例如建表时指定了no_index关键字,或建表后执行DROP INDEX删除了索引)。

此时AnalyticDB MySQL版会使用Filter算子来过滤数据。

Filter算子包含了以下属性。

属性

说明

Filter

过滤算子的过滤条件。

Join

对应SQL语句中的Join操作。AnalyticDB MySQL版在创建分布式表时需要通过Distributed By来设置分布字段,Join key是否为分布字段涉及到数据的重分布类型。关于数据重分布的详情,请参见RemoteExchange

Join算子包含了以下属性。

属性

说明

Criterias

Join条件,例如tb_1.col_a=tb_2.col_a

Type

Join类型。AnalyticDB MySQL版支持4种类型:INNER、LEFT、RIGHT和FULL。

Method

Join算法。AnalyticDB MySQL版支持2种算法:

  • Hash:Hash算法会把小表缓存到内存中,使用Hash表查找的方式完成Join操作。

  • Index:Index算法会充分利用AnalyticDB MySQL版全索引的特点,使用Join key的索引完成Join操作。

JoinFilter

Join过滤条件。

Limit

对应SQL语句中的LIMIT操作。

MarkDistinct

对应SQL语句中的count(DISTINCT)操作。

说明
  • 仅当SQL语句中包含2个或2个以上的count(DISTINCT)操作时,才会使用MarkDistinct算子。

  • 若SQL语句中只包含1个count(DISTINCT)操作,AnalyticDB MySQL版会自动进行优化,使用Aggregation算子。更多详情,请参见Aggregation

Project

对应SQL语句中对特定字段的投影操作,例如case when then控制流、concat()函数等。

Project算子包含了以下属性。

属性

说明

ProjectExpression

Project表达式。

RemoteExchange

该算子用来表示上游向下游Stage传输数据时所用的方法。上下游Stage间传输数据的方法有如下几种:

  • Broadcast:表示上游Stage中每个计算节点的数据都会复制到所有下游Stage的计算节点。

  • Repartition:表示上游Stage中每个节点的数据会按照固定的规则切分后,再分发到下游Stage的指定计算节点。

  • Gather:表示上游Stage中每个节点的数据会集中到下游Stage中某一个特定的计算节点。

关于数据传输方法的详情,请参见Stage层执行计划树

RemoteSource

该算子用来表示当前Stage的输入数据是通过网络从远程节点传输过来的。

RemoteSource算子包含了以下属性。

属性

说明

OutputColumns

算子输出的字段。

StageOutput

该算子用于将当前Stage处理后的数据通过网络传输到下游Stage的节点。

Sort

对应SQL语句中ORDER BY子句的操作,执行ORDER BY字段的排序。

Sort算子包含了以下属性。

属性

说明

OrderBy

排序字段。

Orderings

排序方式。支持如下方式:

  • ASC_NULLS_FIRST:升序,空值在前。

  • ASC_NULLS_LAST:升序,空值在后。

  • DESC_NULLS_FIRST:降序,空值在前。

  • DESC_NULLS_LAST:降序,空值在后。

SortMerge

执行分布排序时,该算子用于对从上游Stage的多个节点传输来的数据进行归并排序。

TableScan

该算子用于从数据源读取数据,如果需要过滤数据,那么数据过滤由底层数据源使用索引高效完成。

TableScan算子包含了以下属性。

属性

说明

TableName

扫描的数据所属表名。

SelectFields

表扫描节点扫描的字段。

DataBase

扫描的数据所属数据库名。

FilterPushDown

过滤条件是否下推到存储节点。

说明

仅当当前Stage中存在过滤条件下推时才会展示该属性。

PushedDownFilter

下推到存储节点的过滤条件。

说明

仅当当前Stage中存在过滤条件下推时才会展示该属性。

TableWriter

在ETL类型的SQL语句(如INSERT INTO或REPLACE INTO)执行完对应的数据查询后,会使用TableWriter算子完成目标表的写入操作。

TopN

对应SQL语句中的ORDER BY LIMIT m,n查询。

TopN算子包含了以下属性。

属性

说明

OrderBy

排序字段。

Count

对应SQL语句中ORDER BY时的LIMIT操作。

Orderings

排序方式。支持如下方式:

  • ASC_NULLS_FIRST:升序,空值在前。

  • ASC_NULLS_LAST:升序,空值在后。

  • DESC_NULLS_FIRST:降序,空值在前。

  • DESC_NULLS_LAST:降序,空值在后。

Step

TopN算子的执行步骤,包括如下步骤:

  • PARTIAL:在分布式排序过程中,对各个节点上的数据进行局部排序。

  • SORTMERGE:对已经进行了局部排序的数据进行最终的归并排序。

  • SINGLE:没有Partial过程,直接进行最终的归并排序。

Offset

对应SQL语句中ORDER BY时的OFFSET操作。

Union

对应SQL语句中的UNION操作。

Window

对应SQL语句中的窗口函数操作。关于窗口函数的详情,请参见窗口函数