多表連接時為每表指定別名,並前綴所有欄位,減少解析時間、避免欄位模糊錯誤。
子查詢連接基礎表時,EXISTS 通常優於 IN。
-- 低效
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 IN 需內部排序合併,對子查詢表全表掃描,最低效。改寫為外部連接或 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_NO(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = 'A';
-- 方法二:NOT EXISTS (最高效)
SELECT ... FROM EMP E
WHERE NOT EXISTS (SELECT 'X' FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND D.DEPT_CAT='A');
註:NOT EXISTS 替換 NOT IN 效能提升最顯著。