数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle语句优化30个规则详解(7)


发布日期:2022年11月09日
 
Oracle语句优化30个规则详解

使用表的别名(Alias)

当在SQL语句中连接多个表时 请使用表的别名并把别名前缀于每个Column上这样一来就可以减少解析的时间并减少那些由Column歧义引起的语法错误

(译者注 Column歧义指的是由于SQL中不同的表具有相同的Column名当SQL语句中出现这个Column时SQL解析器无法判断这个Column的归属)

用EXISTS替代IN

在许多基于基础表的查询中为了满足一个条件往往需要对另一个表进行联接在这种情况下 使用EXISTS(或NOT EXISTS)通常将提高查询的效率

低效

SELECT*

FROMEMP(基础表)

WHEREEMPNO>

ANDDEPTNOIN(SELECTDEPTNO

FROMDEPT

WHERELOC=MELB)

高效

SELECT*

FROMEMP(基础表)

WHEREEMPNO>

ANDEXISTS(SELECTX

FROMDEPT

WHEREDEPTDEPTNO=EMPDEPTNO

ANDLOC=MELB)

(译者按 相对来说用NOT EXISTS替换NOT IN 将更显着地提高效率下一节中将指出)

用NOT EXISTS替代NOT IN

在子查询中NOT IN子句将执行一个内部的排序和合并 无论在哪种情况下NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历) 为了避免使用NOT IN 我们可以把它改写成外连接(Outer Joins)或NOT EXISTS

例如

SELECT…

FROMEMP

WHEREDEPT_NONOTIN(SELECTDEPT_NO

FROMDEPT

WHEREDEPT_CAT=A);

为了提高效率改写为

(方法一 高效)

SELECT…

FROMEMPADEPTB

WHEREADEPT_NO=BDEPT(+)

ANDBDEPT_NOISNULL

ANDBDEPT_CAT(+)=A

(方法二 最高效)

SELECT…

FROMEMPE

WHERENOTEXISTS(SELECTX

FROMDEPTD

WHEREDDEPT_NO=EDEPT_NO

ANDDEPT_CAT=A);

用表连接替换EXISTS

通常来说 采用表连接的方式比EXISTS更有效率

SELECTENAME

FROMEMPE

WHEREEXISTS(SELECTX

FROMDEPT

WHEREDEPT_NO=EDEPT_NO

ANDDEPT_CAT=A);

(更高效)

SELECTENAME

FROMDEPTDEMPE

WHEREEDEPT_NO=DDEPT_NO

ANDDEPT_CAT=A;

(译者按 在RBO的情况下前者的执行路径包括FILTER后者使用NESTED LOOP)

上一篇:配置OracleEnterpriseManager过程总结

下一篇:Oracle 10g学习手册2:安装与构建三(图)