limit 下推

遇到一条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() */ 加这个试试