union all返回结果顺序不确定

举例:
image
其他常见数据库union all 连接多个select 语句,结果集按select 语句出现的顺序排列,而tidb是乱序的,这个应该和分布式数据库特性无关吧,建议改进下

你可以加order by,不加order by不代表排序,数据库这样返回也没问题吧,不同数据内部实现不同,可能会有不同表现。

1 个赞

这里不需要排序操作就是按select顺序排列结果集

sql语义上没有排序啊

1 个赞

我也遇到过,但是不影响使用

是没有,union all语义是把select a结果集和select b结果集放一起输出,大部分数据库都是按照先a在b顺序,和select先后顺序有关系,比如mysql8:


或者Oracle:
image

结果是可以预期的

属于正常现象,因为需要从多个节点进行数据汇总,返回的数据顺序有出入,需要自己制定排序规则

这种sql应该不涉及多个节点的数据汇总

https://dev.mysql.com/doc/refman/5.7/en/union.html#union-order-by-limit 中有专门提到 order 的顺序问题

https://dev.mysql.com/doc/refman/8.0/en/union.html 中似乎都去掉了,可能 mysql 8.0 改过逻辑了

目前 tidb 还在做 mysql 8.0 的适配,可以看看 v7.5 发版后的情况。

不存在多节点汇总,都是同一个tidb server汇总的

union 和union all逻辑不一样,union 要去重,就是数据要汇总做hash或者排序的,union all并不用的

这是分布式多节点获取数据的特点

不是分布式特点,因为不涉及排序,就像我的例子,不涉及从tikv取值问题

对,原本就是这个样子的

1 个赞

看我后面的4 1 3 4 1 3例子 并不是排序

在 SQL 的语义中,只有使用了 order by 语法才会保障结果集的顺序输出。而单机数据库由于数据都存储在一台服务器上,在不进行数据重组时,多次执行的结果往往是稳定的,有些数据库(尤其是 MySQL InnoDB 存储引擎)还会按照主键或索引的顺序进行结果集的输出。TiDB 是分布式数据库,数据被存储在多台服务器上,另外 TiDB 层不缓存数据页,因此不含 order by 的 SQL 语句的结果集展现顺序容易被感知到不稳定。想要按顺序输出的结果集,需明确地把要排序的字段添加到 order by 子句中,这符合 SQL 的语义。

结果集不稳定 | PingCAP 文档中心

和order by无关,这里不涉及对结果集排序