當你發出一條 sql 語句傳遞 Oracle,在執行和擷取結果前,Oracle 對此 sql 将進行幾個步驟 的處理過程:
1、文法檢查(syntax check) 檢查此 sql 的拼寫是否文法。
2、語義檢查(semantic check) 諸如檢查 sql 語句中的通路對象是否存在及該使用者是否具備相應的權限。
3、對 sql 語句進行解析(prase) 利用内部算法對 sql 進行解析,生成解析樹(parse tree)及執行計劃(execution plan)。
4、執行 sql,傳回結果(execute and return) 其中,軟、硬解析就發生在第三個過程裡。
Oracle 利用内部的 hash 算法來取得該 sql 的 hash 值,然後在 library cache 裡查找是否存 在該 hash 值; 假設存在,則将此 sql 與 cache 中的進行比較; 假設“相同”,就将利用已有的解析樹與執行計劃,而省略了優化器的相關工作。這也 就是軟解析的過程。 誠然,如果上面的 2 個假設中任有一個不成立,那麼優化器都将進行建立解析樹、生成 執行計劃的動作。這個過程就叫硬解析。 建立解析樹、生成執行計劃對于 sql 的執行來說是開銷昂貴的動作,是以,應當極力避 免硬解析,盡量使用軟解析。 這 就 是 在 很 多 項 目 中 , 倡 導 開 發 設 計 人 員 對 功 能 相 同 的 代 碼 要 努 力 保 持 代 碼 的 一 緻 性 , 以及要在程式中多使用綁定變量的原因。
查找不能被充分共享利用的SQL語句(查詢LibraryCache中執行次數偏低的SQL語句): SELECT sql_text FROM v$sqlarea WHERE executions < 5 ORDER BY UPPER(sql_text);