根据上面执行计划显示, 其实oracle优化器把改写后的SQL做了查询转换,转换后的SQL应该是下面这个样子:
看到上面这个SQL, 估计很多人就能看出问题了, 这个sql的改写,只是结果上的等价,...这是因为这个SQL使用的一组变量, 返回的结果集为空(最后执行计划我标注1和2的地方), 因为t与m关联后结果集为空, n表的全表扫描不需要了(标注4); t与n关联后结果集为空, m表的全表扫描也不需要了...下面是我给出的改写方法, 非常简单, 只需要把t表在两个子查询中的公共条件从exists里面提取出来就可以了:
有人可能会问, 这样的or exists会不会还是走filter的执行计划?..."先分析一下表"(即收集表的统计信息) :这个可能是对SQL优化不太了解的人做调优的第一板斧,但明显这个SQL不适用;
"子查询结果集小用in" : 这个说法要么不是搞oracle数据库的, 要么还在用...但是这个SQL明显是只能通过改写才能解决性能问题, 给出这样的评论就只能暴露自己认知上的不足.