.owner in (select username from t_users )) v_t2
on t1.object_id=v_t2.object_id;
改写后,得到我需要的执行计划:
从以上两执行计划的比较可以看出...,在当前不到10万的数据量情况下,改写后的sql执行效率提升了将近200倍(t1表越大,效率差别也越大)....这个事实说明,oracle的优化器,在11g的时候,还是有一些小缺憾....对应的hint是DECORRELATE (反向操作就是NO_DECORRELATE),不改隐含参数,使用NO_DECORRELATE,也能回到11g的执行计划.大家有兴趣可以在12c版本上试试....总结:
优化器是数据库性能的核心,SQL写法复杂多变,我们希望优化器能够更加聪明一些,但是毕竟还是基于规则而不是人工智能. 对于优化器规则有限制的情况,一般我们都能通过SQL改写来避免低效.