Calcite 应用于非大数据场景
问题1、关于 order by 问题
如下图1,Mysql 中子查询中有
group by ... order by ...,父查询中不再有相关排序操作,结果能保证子查询的结果顺序不被改变。
但是在 Calcite 中同样操作,结果就会不一致。究其终极原因是 Calcite 面向大数据场景,并且能在可度量的时间范围内交付结果。
The story for
ORDER BYis similar toGROUP BY. The syntax looks like regular SQL, but Calcite must be sure that it can deliver timely results. It therefore requires a monotonic expression on the leading edge of yourORDER BYkey.
所以,开发者在条件为:非最外层查询、没有 offset、没有 limit
等情况下移除语句中的 order by。如下图2。
当前解决方案:最外层增加 ORDER BY
- 在子查询结果中增加隐藏列(类 mysql
未增加主键时默认添加行为),且只保留于内存中用于排序使用,如列名
column_name; - 针对外层查询有聚合
group by时主动增加order by min(column_name); - 其它 case 暂不处理。
图1:查询结果对比图(Mysql vs Calcite)

图2:Calcite 源码中针对 order by 处理逻辑

Calcite 应用于非大数据场景
https://blog.isnap.cn/posts/bfc079bb/