算子
AnalyticDB for MySQL中的一個算子負責完成一個基本的數(shù)據(jù)處理邏輯,合理地組合算子、優(yōu)化算子的順序和執(zhí)行方式,可以提升數(shù)據(jù)的處理效率。本文介紹AnalyticDB for MySQL中的常用算子及算子所對應的屬性。
背景信息
AnalyticDB MySQL版中的一個算子負責完成一個基本的數(shù)據(jù)處理邏輯,一組算子按照執(zhí)行計劃完成數(shù)據(jù)的一組處理規(guī)則。AnalyticDB MySQL版是一個分布式系統(tǒng),大多數(shù)算子可以達到在多個節(jié)點上并行完成計算任務,來提高數(shù)據(jù)處理效率。
您可以通過AnalyticDB MySQL版的SQL診斷功能查看具備屬性的算子以及算子級別的結(jié)果診斷。更多詳情,請參見算子層計劃執(zhí)行樹和算子級別診斷結(jié)果。
只有部分算子具備屬性。
Aggregation
AnalyticDB MySQL版是一個分布式數(shù)據(jù)庫,支持多節(jié)點并行完成聚合操作(更多關于聚合和分組聚合的信息,請參見分組聚合查詢優(yōu)化)。Aggregation算子通過sum()
、count()
、avg()
等函數(shù)對數(shù)據(jù)進行聚合或分組聚合操作。
Aggregation算子包含了以下屬性。
屬性 | 說明 |
GroupByKeys | 分組字段。 |
AggregationFunctions | 使用的聚合函數(shù),例如 說明 如果SELECT字段沒有出現(xiàn)在GROUP BY子句中,也沒有使用任何其他聚合函數(shù),則系統(tǒng)會自動調(diào)用 |
Step | 當前聚合所處的階段,取值如下:
|
DistinctLimit
對應SQL語句中的DISTINCT LIMIT操作。
Filter
AnalyticDB MySQL版支持兩種數(shù)據(jù)過濾過程:
數(shù)據(jù)源過濾:使用存儲層數(shù)據(jù)的索引進行過濾。
說明沒有獨立的算子用于表示數(shù)據(jù)源過濾過程,該過程中的過濾條件會體現(xiàn)在TableScan算子中。關于TableScan算子的詳情,請參見TableScan。
非數(shù)據(jù)源過濾:存儲層數(shù)據(jù)沒有索引,需要在計算層使用Filter算子進行過濾。
AnalyticDB MySQL版默認對所有字段創(chuàng)建了索引,但在如下場景中不會將過濾條件下推:
- 查詢語句中使用了
no_index_columns
或filter_not_pushdown_columns
Hint,或集群使用了adb_config filter_not_pushdown_columns配置,導致過濾條件下推功能被關閉。 - 過濾條件中使用了函數(shù)(包括
cast
操作符)。 - 過濾條件中的相關字段沒有索引(例如建表時指定了
no_index
關鍵字,或建表后執(zhí)行DROP INDEX
刪除了索引)。
此時AnalyticDB MySQL版會使用Filter算子來過濾數(shù)據(jù)。
Filter算子包含了以下屬性。
屬性 | 說明 |
Filter | 過濾算子的過濾條件。 |
Join
對應SQL語句中的Join操作。AnalyticDB MySQL版在創(chuàng)建分布式表時需要通過Distributed By
來設置分布字段,Join key是否為分布字段涉及到數(shù)據(jù)的重分布類型。關于數(shù)據(jù)重分布的詳情,請參見RemoteExchange。
Join算子包含了以下屬性。
屬性 | 說明 |
Criterias | Join條件,例如 |
Type | Join類型。AnalyticDB MySQL版支持4種類型:INNER、LEFT、RIGHT和FULL。 |
Method | Join算法。AnalyticDB MySQL版支持2種算法:
|
JoinFilter | Join過濾條件。 |
Limit
對應SQL語句中的LIMIT操作。
MarkDistinct
對應SQL語句中的count(DISTINCT)
操作。
僅當SQL語句中包含2個或2個以上的
count(DISTINCT)
操作時,才會使用MarkDistinct算子。若SQL語句中只包含1個
count(DISTINCT)
操作,AnalyticDB MySQL版會自動進行優(yōu)化,使用Aggregation算子。更多詳情,請參見Aggregation。
Project
對應SQL語句中對特定字段的投影操作,例如case when then
控制流、concat()
函數(shù)等。
Project算子包含了以下屬性。
屬性 | 說明 |
ProjectExpression | Project表達式。 |
RemoteExchange
該算子用來表示上游向下游Stage傳輸數(shù)據(jù)時所用的方法。上下游Stage間傳輸數(shù)據(jù)的方法有如下幾種:
Broadcast:表示上游Stage中每個計算節(jié)點的數(shù)據(jù)都會復制到所有下游Stage的計算節(jié)點。
Repartition:表示上游Stage中每個節(jié)點的數(shù)據(jù)會按照固定的規(guī)則切分后,再分發(fā)到下游Stage的指定計算節(jié)點。
Gather:表示上游Stage中每個節(jié)點的數(shù)據(jù)會集中到下游Stage中某一個特定的計算節(jié)點。
關于數(shù)據(jù)傳輸方法的詳情,請參見Stage層執(zhí)行計劃樹。
RemoteSource
該算子用來表示當前Stage的輸入數(shù)據(jù)是通過網(wǎng)絡從遠程節(jié)點傳輸過來的。
RemoteSource算子包含了以下屬性。
屬性 | 說明 |
OutputColumns | 算子輸出的字段。 |
StageOutput
該算子用于將當前Stage處理后的數(shù)據(jù)通過網(wǎng)絡傳輸?shù)较掠蜸tage的節(jié)點。
Sort
對應SQL語句中ORDER BY子句的操作,執(zhí)行ORDER BY字段的排序。
Sort算子包含了以下屬性。
屬性 | 說明 |
OrderBy | 排序字段。 |
Orderings | 排序方式。支持如下方式:
|
SortMerge
執(zhí)行分布排序時,該算子用于對從上游Stage的多個節(jié)點傳輸來的數(shù)據(jù)進行歸并排序。
TableScan
該算子用于從數(shù)據(jù)源讀取數(shù)據(jù),如果需要過濾數(shù)據(jù),那么數(shù)據(jù)過濾由底層數(shù)據(jù)源使用索引高效完成。
TableScan算子包含了以下屬性。
屬性 | 說明 |
TableName | 掃描的數(shù)據(jù)所屬表名。 |
SelectFields | 表掃描節(jié)點掃描的字段。 |
DataBase | 掃描的數(shù)據(jù)所屬數(shù)據(jù)庫名。 |
FilterPushDown | 過濾條件是否下推到存儲節(jié)點。 說明 僅當當前Stage中存在過濾條件下推時才會展示該屬性。 |
PushedDownFilter | 下推到存儲節(jié)點的過濾條件。 說明 僅當當前Stage中存在過濾條件下推時才會展示該屬性。 |
TableWriter
在ETL類型的SQL語句(如INSERT INTO或REPLACE INTO)執(zhí)行完對應的數(shù)據(jù)查詢后,會使用TableWriter算子完成目標表的寫入操作。
TopN
對應SQL語句中的ORDER BY LIMIT m,n
查詢。
TopN算子包含了以下屬性。
屬性 | 說明 |
OrderBy | 排序字段。 |
Count | 對應SQL語句中ORDER BY時的LIMIT操作。 |
Orderings | 排序方式。支持如下方式:
|
Step | TopN算子的執(zhí)行步驟,包括如下步驟:
|
Offset | 對應SQL語句中ORDER BY時的OFFSET操作。 |
Union
對應SQL語句中的UNION操作。
Window
對應SQL語句中的窗口函數(shù)操作。關于窗口函數(shù)的詳情,請參見窗口函數(shù)。