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

Oracle 多表查詢優化:WHERE 條件順序、SELECT * 陷阱與減少資料庫往返

     編輯:Oracle 資料庫基礎

WHERE 子句條件順序影響執行計畫

Oracle 自下而上解析 WHERE 子句。**表連接條件寫在前面,過濾性最強的條件寫在最後**。

反面教材 (156.3 秒)

SELECT ...
FROM EMP E
WHERE SAL > 50000
  AND JOB = 'MANAGER'
  AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = E.EMPNO);

優化後 (10.6 秒)

SELECT ...
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = E.EMPNO)
  AND SAL > 50000
  AND JOB = 'MANAGER';

子查詢過濾力最強,放最前面(解析時最後執行),大幅縮減後續掃描行數。

避免 SELECT * 的隱形成本

SELECT * 解析階段需查詢資料字典展開所有欄位名稱,額外消耗 CPU 與字典 Cache。永遠明確列出需要的欄位。

減少資料庫往返次數

每次 SQL 執行皆涉及解析、優化、綁定、讀取塊等內部工作。合併請求可大幅降低負載。

場景:查詢兩位員工資料

方法SQL 往返評價
兩條獨立 SELECT2最低效
PL/SQL 游標迴圈2 (含開啟/關閉游標)次低效
單條 IN 查詢1最高效

最佳寫法

SELECT EMP_NAME, SALARY, GRADE
FROM EMP
WHERE EMP_NO IN (342, 291);

延伸優化技巧

  • 批次繫結:應用端使用 Array Binding(JDBC addBatch、OCI OCIBindArrayOfStruct)一次傳送多筆 DML。
  • 存儲過程封裝:將多步驟業務邏輯封裝為預存程序,單次呼叫完成事務。
  • 結果集快取:11g+ RESULT_CACHE Hint 避免重複查詢熱門靜態資料。

總結

  1. WHERE 條件:連接條件前置,高選擇率條件後置。
  2. 拒絕 SELECT *,明確投影欄位。
  3. 合併同類查詢,善用 IN、EXISTS、批次操作減少網路往返。

這三項習慣無需深諳內部機制,卻能解決 80% 以上的 SQL 效能問題。

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