sql执行很慢,不正常的慢

我理解对于关联子查询都会加上CARTESIAN字样,因为实际执行时候是用的关联算法(类似于lookupjoin)但是又是子查询并非join(只有解关联后才会join形式),所以on condition是空,执行计划就会加上CARTESIAN字样。
正常的join有CARTESIAN说明真正发生了笛卡尔积了(两种原因:1、on condition缺失,2、 非not null定义的反半连接关联子查询解关联后也会有笛卡尔积,这个在6.3版本已经优化了增加了Null-Aware Semi Join能力,但还没有默认开启,因为tiflash不支持,在7.1版本应该都支持了。https://docs.pingcap.com/zh/tidb/stable/explain-subqueries#null-aware-anti-semi-joinnot-in-和--all-子查询 ,相关问题帖子:一个 tidb 无索引查询性能问题请教 参考阿毛哥的最佳答案)

还有一种“局部”笛卡尔积,在执行计划中不标识CARTESIAN,比如部分数据匹配严重多对多,执行计划上可能看不出来但是内部执行时候会发生笛卡尔积。

2 个赞