Calcite 应用于非大数据场景
问题1、关于 order by 问题
如下图1,Mysql 中子查询中有
group by ... order by ...
,父查询中不再有相关排序操作,结果能保证子查询的结果顺序不被改变。
但是在 Calcite 中同样操作,结果就会不一致。究其终极原因是 Calcite 面向大数据场景,并且能在可度量的时间范围内交付结果。
The story for
ORDER BY
is 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 BY
key.
所以,开发者在条件为:非最外层查询、没有 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/