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

Oracle 共享 SQL 與游標共用原理:綁定變數、CURSOR_SHARING 參數與效能陷阱

     編輯:Oracle 資料庫基礎

共享 SQL 機制

Oracle 將解析後的 SQL 文字與執行計畫存放於 SGA 共享池。後續相同 SQL 可直接重用,避免重複解析,大幅降低 CPU 與閂爭用。

匹配規則:嚴格逐字比對

  • 大小寫、空白、換行、註解必須完全一致。
  • 範例:
-- 兩條 SQL 僅字面值不同,無法共用
SELECT * FROM emp WHERE empno = 2000;
SELECT * FROM emp WHERE empno = 1000;

應用端拼接 SQL 的代價

-- Java/C# 等應用層拼接
String sql = "SELECT * FROM emp WHERE empno = " + empno;  // 每次產生不同文字
// 導致大量硬解析,共享池被擠佔,效能急遽下降

解決方案一:綁定變數(最佳實踐)

-- 使用預編譯語句
PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM emp WHERE empno = ?");
ps.setInt(1, empno);  // 同一 SQL 文字,不同值透過綁定傳遞
  • SQL 文字固定,完美共用。
  • 防止 SQL 注入。
  • 優化器可窺探綁定值產生最佳計畫(Bind Variable Peeking)。

解決方案二:CURSOR_SHARING 參數(權宜之計)

值行為
EXACT(預設)嚴格匹配,僅完全相同共用
FORCE強制將字面值替換為系統產生綁定變數(:SYS_B_0),達到共用
SIMILAR(11g 棄用)類似 FORCE,但保留直方圖統計資訊優勢

CURSOR_SHARING=FORCE 的隱藏風險

  1. 計畫不穩定:系統產生的綁定變數無法正確窺探值,可能導致全表掃描與索引掃描在不當場合互換。
  2. 直方圖失效:列有傾斜分布時,FORCE 模式下優化器無法利用直方圖,產生劣質計畫。
  3. 實戰翻車:多位 DBA 反映開啟 FORCE 後效能反而下降,甚至出現 ORA-07445 等 Bug。

建議

  • 新專案:強制要求開發使用綁定變數,CURSOR_SHARING=EXACT。
  • 舊系統無法改代碼:謹慎測試 FORCE,配合 OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES 固定計畫,嚴密監控。
  • 參數修改需重啟:屬 Session/Instance 級,建議在維護窗口調整。

結語

共享 SQL 是 Oracle 高並發效能的基石。綁定變數是正道,CURSOR_SHARING 是有副作用的止痛藥。架構師應從源頭規範開發模式,而非依賴參數彌補設計缺陷。

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