首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle SQL 解析六大步驟:從語法檢查到共用池載入

     編輯:Oracle 資料庫相關知識

Oracle 處理一條 SQL 經歷六個解析階段,理解這六步驟有助於診斷硬解析、共用池爭用、權限錯誤、執行計劃不穩等問題。

六大解析步驟詳細流程

  1. 語法檢查: 驗證 SQL 符合文法規則(關鍵字、標點、識別子),失敗拋 ORA-009xx 系列錯誤
  2. 語義檢查(資料字典): 查詢 DBA_/ALL_/USER_TABLES、TABCOL$ 確認表、欄位存在,失敗拋 ORA-00942、ORA-00904
  3. 權限檢查: 查詢 DBA_TAB_PRIVS、DBA_SYS_PRIVS、DBA_ROLE_PRIVS 確認當前用戶具備操作權限,失敗拋 ORA-01031
  4. 解析鎖: 於 Library Cache 獲取該 SQL 對應 Library Cache Object 的 **Parse Lock**(共享模式),防止 DDL 同時修改物件定義導致解析失效
  5. 優化器生成執行計劃: CBO(預設)根據統計資訊、系統參數、綁定變數窺探、動態取樣選擇最低 Cost 計劃;RBO(已棄用)依規則
  6. 載入共用池: 將 SQL 文本、解析樹、執行計劃存入 **Library Cache**(SGA 組件),分配 **SQL_ID**、**Plan Hash Value**,後續相同 SQL 可直接複用(軟解析)

硬解析 vs 軟解析

類型觸發條件經歷步驟耗費
硬解析Library Cache 無匹配 SQL(新 SQL、字面量不同、DDL 導致失效、統計資訊收集導致失效)完整 6 步驟高(CPU、Latch、共用池記憶體)
軟解析Library Cache 命中相同 SQL(文本完全一致、綁定變數化)步驟 1-3(語法/語義/權限)+ 直接複用計劃低

減少硬解析關鍵實務

  • 強制綁定變數: 應用層使用 PreparedStatement、Bind Variables,避免字面量拼接
  • 設定 CURSOR_SHARING = FORCE(謹慎): 自動將字面量替換為系統綁定變數,可能導致計劃不穩,建議配合 SQL Plan Baseline 使用
  • 避免 DDL 高峰期執行: TRUNCATE、ALTER INDEX REBUILD、GATHER_STATS 會導致相關 Cursor 失效,引發硬解析風暴
  • 監控硬解析比率: SELECT * FROM v$sysstat WHERE name IN ('parse count (hard)','parse count (total)'); 硬解析佔比 > 5% 需關注

共用池關鍵視圖

-- 查看 SQL 文本、執行計劃、執行統計
SELECT sql_id, plan_hash_value, executions, parse_calls, loads, invalidations,
       elapsed_time/1e6 elapsed_sec, cpu_time/1e6 cpu_sec,
       buffer_gets, disk_reads, rows_processed
FROM v$sqlarea
WHERE sql_text LIKE '%your_table%'
ORDER BY last_active_time DESC;

解析不是「編譯」,而是「語法+語義+權限+鎖+優化+快取」的完整流程。**綁定變數化是減少硬解析的銀彈**,配合 Cursor 共用、Plan Baseline,構建穩定高效的 SQL 執行引擎。

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