ORACLESQL性能優(yōu)化系列(五)

字號:

17. 使用表的別名(Alias)
    當(dāng)在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤.
    (譯者注: Column歧義指的是由于SQL中不同的表具有相同的Column名,當(dāng)SQL語句中出現(xiàn)這個Column時,SQL解析器無法判斷這個Column的歸屬)
    18. 用EXISTS替代IN
    在許多基于基礎(chǔ)表的查詢中,為了滿足一個條件,往往需要對另一個表進(jìn)行聯(lián)接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率.
    低效:
    SELECT *
    FROM EMP (基礎(chǔ)表)
    WHERE EMPNO > 0
    AND DEPTNO IN (SELECT DEPTNO
    FROM DEPT
    WHERE LOC = ‘MELB’)
    高效:
    SELECT *
    FROM EMP (基礎(chǔ)表)
    WHERE EMPNO > 0
    AND EXISTS (SELECT ‘X’
    FROM DEPT
    WHERE DEPT.DEPTNO = EMP.DEPTNO
    AND LOC = ‘MELB’)
     (譯者按: 相對來說,用NOT EXISTS替換NOT IN 將更顯著地提高效率,下一節(jié)中將指出)
    19. 用NOT EXISTS替代NOT IN
    在子查詢中,NOT IN子句將執(zhí)行一個內(nèi)部的排序和合并. 無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執(zhí)行了一個全表遍歷). 為了避免使用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’);