子查询的order by失效问题

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】v7.5.0
【复现路径】一个子查询使用order by语法,子查询中分别加limit和不加limit语法
【遇到的问题:问题现象及影响】
子查询带有limit语法的,子查询的order by会生效,不带limit语法的,order by被优化器优化掉了
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
子查询带limit子句的:

子查询不带limit子句的:
无limit

表id应该是主键索引吧? 是的话,这里就可以解释的通,limit结果集有一次排序,虽然数据是有序的;没有limit ,order by id 实际就是全表扫描,本身就是有序的,order by 估计是被优化了

是不是因为这就是默认排序了

是的,id是主键索引。

问题是,如果在最外层查询加上limit offset,这时子查询的order by已经被优化掉了,就会导致每次返回的数据不一致

子查询本身就不支持排序。

可是加了limit就可以排序了?

https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_remove_orderby_in_subquery-从-v610-版本开始引入

1 个赞

:+1:t2:
能了解下,为什么默认子查询要移除order by吗?
我们的场景是,使用一个分布式查询框架,框架会自动计算limit offset值,套在我们提供的查询外面

因为从语义上讲,外层查询没有要求排序,所以移除 roder by
里面有 limit ,语义上是按 id 取前 n 条,所以不能移除 order by

ok,除了语义上的区别,性能上有什么影响吗?或者说当初添加这个参数是有其他的考虑吗?

性能需要看具体的场景了,可能更快、可能更慢

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。