Oracle 處理一條 SQL 經歷六個解析階段,理解這六步驟有助於診斷硬解析、共用池爭用、權限錯誤、執行計劃不穩等問題。
ORA-009xx 系列錯誤DBA_/ALL_/USER_TABLES、TABCOL$ 確認表、欄位存在,失敗拋 ORA-00942、ORA-00904DBA_TAB_PRIVS、DBA_SYS_PRIVS、DBA_ROLE_PRIVS 確認當前用戶具備操作權限,失敗拋 ORA-01031| 類型 | 觸發條件 | 經歷步驟 | 耗費 |
|---|---|---|---|
| 硬解析 | Library Cache 無匹配 SQL(新 SQL、字面量不同、DDL 導致失效、統計資訊收集導致失效) | 完整 6 步驟 | 高(CPU、Latch、共用池記憶體) |
| 軟解析 | Library Cache 命中相同 SQL(文本完全一致、綁定變數化) | 步驟 1-3(語法/語義/權限)+ 直接複用計劃 | 低 |
PreparedStatement、Bind Variables,避免字面量拼接CURSOR_SHARING = FORCE(謹慎): 自動將字面量替換為系統綁定變數,可能導致計劃不穩,建議配合 SQL Plan Baseline 使用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 執行引擎。