首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQL 效能優化實戰(九):表別名、EXISTS 替代 IN、NOT EXISTS 替代 NOT IN

     編輯:Oracle 資料庫基礎

17. 善用表別名

多表連接時為每表指定別名,並前綴所有欄位,減少解析時間、避免欄位模糊錯誤。

18. 以 EXISTS 取代 IN

子查詢連接基礎表時,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');

19. 以 NOT EXISTS 取代 NOT IN

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 效能提升最顯著。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved