ORACLE SQL性能优化系列 (五)

** 17. ** ** 使用表的别名 (Alias) **

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


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


** 18. ** ** 用 EXISTS ** ** 替代 IN **

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

低效 :

SELECT *

FROM EMP ( 基础表 )

WHERE EMPNO > 0

AND DEPTNO IN (SELECT DEPTNO

FROM DEPT

WHERE LOC = ‘MELB’)

高效 :

SELECT *

FROM EMP ( 基础表 )

WHERE EMPNO > 0

AND EXISTS (SELECT ‘X’

FROM DEPT

WHERE DEPT.DEPTNO = EMP.DEPTNO

AND LOC = ‘MELB’)

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



** 19. ** ** 用 NOT EXISTS ** ** 替代 NOT IN **

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

例如 :

SELECT …

FROM EMP

WHERE DEPT_NO NOT IN (SELECT DEPT_NO

FROM DEPT

WHERE DEPT_CAT=’A’);

为了提高效率 . 改写为 :

( 方法一 : 高效 )

SELECT ….

FROM EMP A,DEPT B

WHERE A.DEPT_NO = B.DEPT(+)

AND B.DEPT_NO IS NULL

AND B.DEPT_CAT(+) = ‘A’

( 方法二 : 最高效 )

SELECT ….

FROM EMP E

WHERE NOT EXISTS (SELECT ‘X’

FROM DEPT D

WHERE D.DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A’); ** **


(待续)

Published At
Categories with 数据库类
comments powered by Disqus