天天看點

Oracle 對 sql 的處理過程

當你發出一條 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);