1.什么是表移除。
表移除是优化器处理带多表连接的目标SQL的一种优化手段,它是指优化器会把虽然在目标
SQL中存在,但是其存在与否对最终执行结果没有影响的表从该目前SQL中移除,这样优化器
至少可以做一次表连接,进而就提高了原目标SQL的执行效率。
表移除技术在Oracle10gR2中就已经被引入了。
2.表移除的案例SQL
select ename from emp,dept
where emp.deptno=dept.deptno;
执行计划中只有 EMP表的 TABLE ACCESS FULL,而没有DEPT 表。
说明这里做了表移除。
原因是 EMP和DEPT表在DEPTNO上存在主外键关系。
在做表移除时,oracle的filter(EMP.DEPTNO IS NOT NULL);
alter table emp modify (deptno null);
再次执行,还是做表移除,不过在过滤部分有:filter(EMP.DEPTNO IS NOT NULL);
说明通过过滤非空值做表移除。
表移除不仅适用于表与表之间通过外键关联的情形,还适用于表与表之间是外连接的情形。
例如:
select ename from emp ,dept
where emp.deptno=detp.deptno(+);
--此SQL会做表移除,只访问表EMP;
--TABLE ACCESS FULL
表移除在很多情况下还是可以发挥作用的,比如针对于视图的查询,很多系统都用到了视图,
使用视图的一个目的就是对外提供统一的查询接口,开发人员可以不关心视图底层
基表的逻辑和具体结构,只需要查询视图中对应的封装好的列就可以了。这样当查询
由多表关联形成的视图时,表移除也许就会发挥作用了。
create view view_te as
select emp.empno,emp1.ename,dept.dname
from emp,emp1,dept
where emp.empno=emp1.empno
and emp.deptno=dept.deptno;
当查询由多表关联形成的视图时,Oracle确实会根据查询列的来源以及是否
满足表移除的前提条件来决定是否做表移除。
3.总结
表移除的好处是,虽然是做多表关联,但是只取其中一个表里面的数据。
通过表移除,减少访问表的次数,提升效率。表移除的直观的结果是,
SQL语句中出现该表,但由于SELECT语句没有使用该表的字段,执行计划中也没有
出现该表,未访问该表。