Calcite 应用于非大数据场景

问题1、关于 order by 问题

如下图1,Mysql 中子查询中有 group by ... order by ...,父查询中不再有相关排序操作,结果能保证子查询的结果顺序不被改变。

但是在 Calcite 中同样操作,结果就会不一致。究其终极原因是 Calcite 面向大数据场景,并且能在可度量的时间范围内交付结果

The story for ORDER BY is similar to GROUP 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 your ORDER BY key.

所以,开发者在条件为:非最外层查询、没有 offset、没有 limit 等情况下移除语句中的 order by如下图2。

当前解决方案:最外层增加 ORDER BY

  1. 在子查询结果中增加隐藏列(类 mysql 未增加主键时默认添加行为),且只保留于内存中用于排序使用,如列名column_name
  2. 针对外层查询有聚合group by时主动增加order by min(column_name)
  3. 其它 case 暂不处理。

图1:查询结果对比图(Mysql vs Calcite)

image-20230308094943042

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

image-20230308170035263


Calcite 应用于非大数据场景
https://blog.isnap.cn/posts/bfc079bb/
作者
三岁于辛
发布于
2023年3月8日
许可协议