SORT 逻辑算子主要有三种,分别是普通排序,前缀排序和 TOP-N 排序。生成逻辑计划时,优化器会对 SORT 选择最优的算法。选择的依据是:

  • 下层算子的结果的序和 SORT 算子的排序表达式的关系;

普通排序

当下层算子的结果是无序的,或者下层算子的结果有序但是与 SORT 算子的排序键无关时,使用普通的排序算法。

前缀排序

当下层算子结果是有序的,且与 SORT 算子的排序键存在公共前缀,使用前缀排序。

如下例所示,T2 的主键为 (a, b),SORT 算子排序键为 (a, c),那么公共前缀就是 a。优化器会认为可以利用 a 的序,所以选择前缀排序。其中 prefix_pos(1) 表示前1个列已经有序,不再需要比较。

TOP-N 排序

如下例所示,SORT 算子上层为 LIMIT 算子,只要求5行数据,所以下层 SORT 采用 TOP-N 排序算法,COST 比常规排序要小。需要注意的是 TOP-N 算法与前缀排序算法可以同时作为 SORT 算子的优化算法存在。

SORT 算子的消除

当下层算子的序与 SORT 算子的序相同的时候,SORT 算子可以消除。

SORT 算子落盘

当 SORT 算子在执行的过程中,如果检测到当前算子使用的内存超过限制(目前为128M)或者当前租户的ob_sql_work_area_percentage 所表示的内存被占满时,当前 SORT 所使用的内存将会落盘,并执行外排。因为该操作是在执行时判断的,所以对于用户来说并不可见,但是对于实际性能是有影响的。