遇到一条SQL order by 的字段为全空,但是加了limit之后,查询结果顺序和不加limit的结果顺序不一致,感觉是因为limit下推到tikv导致的,所以想禁止这单条SQL的limit下推,文档只找到全局黑名单和limit-hint下推的方式,想到加一个join (select 1)的方式,成功了,想问问还有什么方式实现吗?
如果 order by的字段是全空,那每次查询出来的结果tidb是不保证每次都一致的啊,因为是分布式数据库,这个和limit下不下推没关系吧,你不加limit,多次查询,结果能保持稳定吗?
1 个赞
奇怪的就在这,不加limit结果集是稳定的,但没有测试过其他SQL
https://docs.pingcap.com/zh/tidb/stable/dev-guide-unstable-result-set#select--from-t-limit-n-的结果不稳定
返回结果与数据在存储节点 (TiKV) 上的分布有关。如果进行了多次查询,存储节点 (TiKV) 不同存储单元 (Region) 返回结果的速度不同,会造成结果不稳定。
因为你order by的字段是空值,其实就和没有order by一样。
难道order by 空还有特殊的处理逻辑,不过不管咋说,你通过禁止limit下推来解决有点无厘头吧,不如让开发order by唯一字段合理点,只有这种情况tidb保证每次返回的结果唯一。。。
1 个赞
TiDB 中 ORDER BY
语句对 NULL
的排序规则:
-
ORDER BY COLUMN ASC
时,NULL
默认被放在最前。 -
ORDER BY COLUMN DESC
时,NULL
默认被放在最后。
不显示指定排序规则时默认是ASC,又因为每个TiKV返回结果速度不一致,涉及null排序时,结果集就会不稳定了
SELECT /*+ NO_INDEX_MERGE() */ 加这个试试