使用表的别名(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)