ORACLE SQL效能最佳化系列 (五) (轉)

gugu99發表於2007-08-16
ORACLE SQL效能最佳化系列 (五) (轉)[@more@]

17.  使用表的別名(Alias):namespace prefix = o ns = "urn:schemas--com::office" />

當在語句中連線多個表時, 請使用表的別名並把別名字首於每個Column上.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤.

(譯者注: Column歧義指的是由於SQL中不同的表具有相同的Column名,當SQL語句中出現這個Column時,SQL解析器無法判斷這個Column的歸屬)

18.  用EXISTS替代IN

在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的.

低效:

*

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’);

(待續)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章