Oracle SQL語句的執(zhí)行過程詳解
http://database.51cto.com/art/200511/12457.htm在Oracle SQL語句的執(zhí)行過程中,Oracle數(shù)據(jù)庫的內(nèi)部分析原理,即 ,當(dāng)某個用戶***次提交關(guān)于Oracle SQL表達(dá)式的時候,Oracle就會將這SQL語句進(jìn)行Hard parse,這過程有點像程序編譯,檢查語法、表名、字段名等相關(guān)信息(如下圖),這過程會花比較長的時間,因為它要分析語句的語法與語義。
然后獲得***化后的執(zhí)行計劃(sql plan),并在內(nèi)存中分配一定的空間保存該語句與對應(yīng)的執(zhí)行計劃等信息。
當(dāng)用戶第二次請求或多次請求時,Oracle會自動找到先前的語句與執(zhí)行計劃,而不會進(jìn)行Hard parse,而是直接進(jìn)行Soft parse(把語句對應(yīng)的執(zhí)行計劃調(diào)出,然后執(zhí)行),從而減少數(shù)據(jù)庫的分析時間。
注意的是:Oracle中只能完全相同的語句,包大小寫、空格、換行都要求一樣時,才會重復(fù)使用以前的分析結(jié)果與執(zhí)行計劃。
分析過程如下圖:
對于大量的、頻繁訪問的Oracle SQL語句,如果不采用Bind 變量的方式,哪Oracle會花費大量的Shared latch與CPU在做Hard parse處理,所以,要盡量提高語句的重用率,減少語句的分析時間,通過了解OracleSQL語句的分析過程可以明白Oracle的內(nèi)部處理邏輯,并在設(shè)計與實現(xiàn)上避免。
在用JDBC或其它持久化數(shù)據(jù)(如Hibernate,JDO等)操作時,盡量用占位符(?)
【編輯推薦】