在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样。
![20210624113153](https://i-blog.csdnimg.cn/blog_migrate/f8dcea0022eb1f9931afc505c06059f0.png)
![20210624113259](https://i-blog.csdnimg.cn/blog_migrate/88b13f6c72191a79fbbbc5b871a5a66a.png)
对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = 'LOC'过滤条件; 保证shopInfo的记录非NULL,因此left join在优化过程中可以转为inner join。 那么O和S的JOIN顺序就是可以交换的。
验证结论:
创建表:
--班级表
CREATE TABLE T_CLASS(
class_id int not null,
class_name VARCHAR2(100)
);
添加索引
alter table T_CLASS add index inx_cla