一文掌握 Velox orderby 算子的排序算法
0 引言
排序是计算机科学中研究最深入的问题之一。高效排序算法的研究主要集中在缓存效率、减少分支预测错误、并行性和最坏情况模式等关键问题上,但主要限于对大型整数数组进行排序。数据库系统研究主要关注许多相同的问题,并且数据库系统具有一些最实用的排序用例:ORDER BY 和 WINDOW 等算子需要明确使用到排序。因此,拥有高效的排序实现以提供快速查询响应时间至关重要,尤其是对于分析 (OLAP) 数据管理系统而言。对关系数据进行排序比对整数数组进行排序更复杂,本文将详细介绍 Velox 的 OrderBy 算子的实现。
1 OrderBy 算子简介
在 Velox 里面以下的查询执行计划树里面包含 OrderBy 算子。
SELECT c_customer_sk, c_birth_country, c_birth_year
FROM customer
ORDER BY c_birth_country DESC,
c_birth_year ASC NULLS LAST;
在上面查询中,c_birth_country 按降序排列,如果 c_birth_country 相等,则按 c_birth_year 升序排序。通过指定 NULLS LAST,空值将被视为 c_birth_year 列中的最小值。和我们平常了解的排序算法不一样的地方是,除了 c_birth_country 和 c_birth_year 列需要排序,c_customer_sk 也得更着排序。在业界排序的列称为 key columns,而其他要输出的列称为 payload columns。