在接觸過oracle優化器的特徵以後,咱們都知道oracle優化器的一個迷人之處,就在於shared pool的設計,說準確點是shared pool中的Library Cache,這種設計的結果就是讓執行計劃變得可緩存。所以產生了軟解析的概念,這就保證了相同SQL在統計信息不發生變化的前提下只用經歷一次繁雜的解析過程。而相對比軟解析,oracle優化器還有一種更爲特殊的行爲,即軟軟解析,發生軟軟解析過程的SQL將消耗更小的開銷,執行更加迅速。sql
首先了解下oracle中的兩種sql cursor,Shared Cursor 和 Session Cursor。
1.Shared cursor。緩存於SGA的shared pool,Oracle的Shared Cursor分爲Parent Cursor(父遊標)和Child Cursor(子游標),父遊標存儲SQL的文本,子游標則存儲sql的執行計劃。
2.Session Cursor。緩存於PGA的private sql區,在執行SQL時建立,通常SQL執行完畢釋放。Session cursor和shared cursor的區別就在於,session cursor是session私有的,這其實也是PGA與SGA的區別。緩存
接下來聊下PGA的組成。
1.PGA=UGA + CGA
2.CGA。即call global area,包含排序區+散列區+位圖合併區
3.UGA=user session + cursor state(private sql區)session
user session(會話信息區)
存放用戶權限,角色,性能統計等信息。
private sql
固定部分:綁定信息,數據結構信息,指針。隨session的建立而建立,結束而釋放
動態部分:執行sql的中間結果集,如多表聯查,排序。隨sql的建立而建立,結束而釋放數據結構
那麼前面說的session cursor對應UGA中private sql區的動態部分,當執行SQL語句的時候建立,主要用於做爲SQL中間結果集的緩存區域,可是當一個SQL在同一個會話中連續執行三次以上時,這個cursor會被緩存,當相同SQL再次執行時,直接使用這個打開的遊標。oracle
首先看下SQL解析的過程,大體能夠歸納以下。
1.語法、語義及權限檢查;
2.查詢轉換(語句等價轉換,又稱爲邏輯優化);
3.執行遞歸查詢獲取統計信息;
4.根據統計信息計算每條執行路徑的執行開銷
5.選擇開銷最小的執行路徑做爲執行計劃性能
在整個解析過程當中,步驟3和4是最其自己的性能開銷所在,而軟解析正是爲了節省這兩個步驟而設計的(實際上也省去了步驟2)。
那麼軟軟解析呢?正如前面所說,當session cursor被緩存時,下一次在同一會話執行同一個SQL的時候就能夠直接使用這個打開的遊標,這個過程就是軟軟解析。軟軟解析相對比軟解析,甚至還省去了步驟1和2,而且還減小了打開遊標的開銷。
直接使用這個還未關閉的遊標,意味着提交這個SQL請求以後,接下來就能夠直接去獲取執行計劃執行該SQL了,而軟解析在命中執行計劃以前還須要經歷SQL hash查找的過程。優化
能夠查詢相關視圖查看某會話中發生軟軟解析的狀況,以下
spa
session cursor cache count
這個數值指的是當前會話緩存的的這種sql cursor的總數量
可經過參數設置單個會話最大可緩存cursor的總數量
設計
session cursor cache hits
在session cursor cache找到的次數。在session中每發生一次軟軟解析,就表明session cursor cache的一次命中。指針
一樣是爲了節省解析帶來的性能開銷,軟軟解析實質上是軟解析的一個特例。 而不管是哪一種解析過程,ORACLE在解析和執行目標SQL時,始終會按照以下邏輯生成執行計劃。 1.查找PGA的private sql area,若命中,發生軟軟解析,若不命中進行步驟2; 2.在Library Cache中匹配該SQL的hash值,若命中發生軟解析,不然進入步驟3; 3.發生硬解析,將會執行遞歸查詢獲取統計信息,而且用來計算執行開銷,而後生成執行計劃,並將執行計劃緩存在Library Cache中。