通过Hint改变where语句执行顺序

【 TiDB 使用环境】生产环境
【 TiDB 版本】5.4.3
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
SELECT *
FROM table_a a LEFT JOIN table_b b ON a.user_id = b.user_id
WHERE a.a = ‘1’
AND b.b = ‘1’;

如上面的SQL,查看上面语句的执行计划,在不同时间,会出现两种不同的结果:
第一种结果:优先执行where子句的a.a=‘1’,执行速度非常快;
第二种结果:优先执行where子句的b.b=‘1’,执行速度非常慢;
可以通过Hint来指定SQL语句在执行时,优先执行where子句的a.a=‘1’ 吗?

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

2种不同的方式执行计划贴下

1 个赞

left join应该都是先执行 a.a = ‘1’这个吧

我看到只有STRAIGHT_JOIN 在等值连接时能控制表连接顺序,你这个是left join 没看到控制执行顺序的方法,但是如果优化器没有按最快的方式走,可以考虑analyze 或者增加索引尝试让优化器自动走快的方式。

STRAIGHT_JOIN()

STRAIGHT_JOIN() 提示优化器在生成表连接顺序时按照表名在 FROM 子句中出现的顺序进行连接。

SELECT /*+ STRAIGHT_JOIN() */ * FROM t t1, t t2 WHERE t1.a = t2.a;

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。