v4.0-rc IndexMergeJoin算子有bug,指定执行计划 无法绕过

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0-rc
  • 【问题描述】:

同一条SQL,带limit 和不带limit

select ..... limit 0, 1000
select ..... 

通过explain analyze 发现:

带limit,触发使用了算子 IndexMergeJoin, 中间数据集为0

不带limit,触发使用了算子 IndexHashJoin,中间数据集为1.4w条

这是个bug,参考:https://github.com/pingcap/tidb/issues/15687。 具体:IndexMergeJoin使用了错误的计算逻辑,导致计算数据为空;官方改用UnionRanges 支持数据处理。

想确认下,15687 这个issue 没在tidb-v4.0.0-rc版本里,那是在tidb-v4.0.0-rc.1?

另外,通过强制指定查询规划,也无效:

SELECT /*+ INL_HASH_JOIN(table1, table2 )*/ ...... limit 1, 1000
SELECT /*+ HASH_JOIN(table1, table2 )*/ ...... limit 1, 1000

explain analyze 还是在用IndexMergeJoin。

想问问,执行计划绑定 还有其他方法嘛,我们如何先绕过去这个bug?

  1. 是否方便贴一下这两个完整的执行计划,多谢
  2. 这个 bug 我确认下在哪个版本合并,稍后答复
  3. 麻烦提供完整的 sql ,看下如何绑定的不生效,多谢

https://pingcap.com/docs-cn/dev/reference/performance/optimizer-hints/

另外,还麻烦发下完整的 schema。目前无法判断是否是因为这个 bug。

那个 issue 在 v4.0.0-rc 里修复了。如果你用的是 v4.0.0-rc,应该不是同一个问题。