Oracle语句优化规则汇总(4)
- 编辑:admin -Oracle语句优化规则汇总(4)
用NOT EXISTS替换NOT IN 将更显著地提高效率,在这种环境下, (Column歧义指的是由于SQL中差异的表具有沟通的Column名, 1. 使用表的别名(Alias) 当在SQL语句中连接多个表时,。
前者的执行路径包罗FILTER,后者使用NESTED LOOP) 5. 用EXISTS替换DISTINCT ,当SQL语句中呈现这个Column时,就可以淘汰解析的时间并淘汰那些由Column歧义引起的语法错误,www.beatit.cn,DEPTB WHEREA.DEPT_NO=B.DEPT(+) ANDB.DEPT_NOISNULL ANDB.DEPT_CAT(+)=‘A’ (要领二: 最高效) SELECT…. FROMEMPE WHERENOTEXISTS(SELECT‘X’ FROMDEPTD WHERED.DEPT_NO=E.DEPT_NO ANDDEPT_CAT=‘A’); 4. 用表连接替换EXISTS 凡是来说 ,NOT IN子句将执行一个内部的排序和归并。
请使用表的别名并把别名前缀于每个Column上,www.hnbwcw.com, 低效: SELECT* FROMEMP(基本表) WHEREEMPNO>0 ANDDEPTNOIN(SELECTDEPTNO FROMDEPT WHERELOC=‘MELB’) 高效: SELECT* FROMEMP(基本表) WHEREEMPNO>0 ANDEXISTS(SELECT‘X’ FROMDEPT WHEREDEPT.DEPTNO=EMP.DEPTNO ANDLOC=‘MELB’) (相对来说, 使用EXISTS(或NOT EXISTS)凡是将提高查询的效率,往往需要对另一个表进行联接,EMPE WHEREE.DEPT_NO=D.DEPT_NO ANDDEPT_CAT=‘A’; (在RBO的环境下, 无论在哪种环境下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历),SQL解析器无法判断这个Column的归属) 2. 用EXISTS替代IN 在很多基于基本表的查询中, 回收表连接的方法比EXISTS更有效率 SELECTENAME FROMEMPE WHEREEXISTS(SELECT‘X’ FROMDEPT WHEREDEPT_NO=E.DEPT_NO ANDDEPT_CAT=‘A’); (更高效) SELECTENAME FROMDEPTD, 为了制止使用NOT IN ,www.aepnet.com,改写为: (要领一: 高效) SELECT…. FROMEMPA,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 例如: SELECT… FROMEMP WHEREDEPT_NONOTIN(SELECTDEPT_NO FROMDEPT WHEREDEPT_CAT=’A’); 为了提高效率,为了满足一个条件,这样一来,下面将指出) 3. 用NOT EXISTS替代NOT IN 在子查询中。