根据上面执行计划显示, 其实oracle优化器把改写后的SQL做了查询转换,转换后的SQL应该是下面这个样子:
看到上面这个SQL, 估计很多人就能看出问题了, 这个sql的改写,只是结果上的等价,...如果是这样, 你觉得这个SQL的执行时间还会是10毫秒吗?
综上分析, 这个SQL的改写效果只是在特定变量下的表现, 换一组变量, 效率可能要差很多很多.
这个SQL的正确改写方法是什么呢?...下面是我给出的改写方法, 非常简单, 只需要把t表在两个子查询中的公共条件从exists里面提取出来就可以了:
有人可能会问, 这样的or exists会不会还是走filter的执行计划?...其实oracle从11g版本开始就可以对这个之前只能走filter的执行计划做查询转换, 使用的是一个叫unnest_disjunctive_subq的查询转换规则, 自动将sql转换成下面这个样子(下面其实是我的改写..., 我没看10053, 根据执行计划反推的):
如果你用的是mysql或是postgresql的数据库, 遇到这样的sql, 如果不能像oracle优化器那样做查询转换, 也可以手工改成上面这个样子,