tidb-There are no matching table names optimizer hint /*+ HASH_JOIN(m1, m2) */

一、问题

出现报错:1105 - runtime error: index out of range [1] with length 1,这个在tidb里是一种很常见的bug,是由于执行计划不对导致的查询报错,但是我有三个tidb,其中两个执行计划都是对的(显然这有点问题,但这不是本次讨论的重点),这样就比较好排查了。

二、排查

通过explain对比执行计划,发现正常执行的left join是hash join,非正常执行的left join是index join,那这样就很好解决这个问题了,只需要通过hint来指定left join为hash join即可

三、解决

最初写法;

select /*+ HASH_JOIN(m1,m2) */ 

通过这样指定后,我们发现warning中提示There are no matching table names optimizer hint /*+ HASH_JOIN(m1, m2) */,这意味着我们的hint操作并没有奏效,那么这是为什么呢,仔细排查后发现,m1,m2并不在一个数据库中,这会造成优化器的误解,所以需要在hint中指定库名,它才能正确的执行hint

正确写法:

select /*+ HASH_JOIN(db1.m1,db2.m2) */ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值