對Oracle軟軟解析的一點看法

2021-08-10 17:46:40 字數 2227 閱讀 6287

摘要: 本文將介紹oracle解析器的一種較為特殊的解析行為,軟軟解析。

在接觸過oracle優化器的特徵之後,我們都知道oracle優化器的乙個迷人之處,就在於shared pool的設計,說準確點是shared pool中的library cache,這種設計的結果就是讓執行計畫變得可快取。因此產生了軟解析的概念,這就保證了相同sql在統計資訊不發生變化的前提下只用經歷一次繁雜的解析過程。而相對比軟解析,oracle優化器還有一種更為特殊的行為,即軟軟解析,發生軟軟解析過程的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區)

user session(會話資訊區)

存放使用者許可權,角色,效能統計等資訊。

private sql

固定部分:繫結資訊,資料結構資訊,指標。隨session的建立而建立,結束而釋放

動態部分:執行sql的中間結果集,如多表聯查,排序。隨sql的建立而建立,結束而釋放

那麼前面說的session cursor對應uga中private sql區的動態部分,當執行sql語句的時候建立,主要用於作為sql中間結果集的快取區域,但是當乙個sql在同乙個會話中連續執行三次以上時,這個cursor會被快取,當相同sql再次執行時,直接使用這個開啟的游標。

首先看下sql解析的過程,大致可以概括如下。

1.語法、語義及許可權檢查;

2.查詢轉換(語句等價轉換,又稱為邏輯優化);

3.執行遞迴查詢獲取統計資訊;

4.根據統計資訊計算每條執行路徑的執行開銷

5.選擇開銷最小的執行路徑作為執行計畫

在整個解析過程中,步驟3和4是最其本身的效能開銷所在,而軟解析正是為了節省這兩個步驟而設計的(實際上也省去了步驟2)。

那麼軟軟解析呢?正如前面所說,當session cursor被快取時,下一次在同一會話執行同乙個sql的時候就可以直接使用這個開啟的游標,這個過程就是軟軟解析。軟軟解析相對比軟解析,甚至還省去了步驟1和2,並且還減少了開啟游標的開銷。

直接使用這個還未關閉的游標,意味著提交這個sql請求之後,接下來就可以直接去獲取執行計畫執行該sql了,而軟解析在命中執行計畫之前還需要經歷sql hash查詢的過程。

可以查詢相關檢視檢視某會話中發生軟軟解析的情況,如下

這個數值指的是當前會話快取的的這種sql cursor的總數量

可通過引數設定單個會話最大可快取cursor的總數量

在session cursor cache找到的次數。在session中每發生一次軟軟解析,就代表session cursor cache的一次命中。

同樣是為了節省解析帶來的效能開銷,軟軟解析實質上是軟解析的乙個特例。

而無論是哪種解析過程,oracle在解析和執行目標sql時,始終會按照如下邏輯生成執行計畫。

1.查詢pga的private sql area,若命中,發生軟軟解析,若不命中進行步驟2;

2.在library cache中匹配該sql的hash值,若命中發生軟解析,否則進入步驟3;

3.發生硬解析,將會執行遞迴查詢獲取統計資訊,並且用來計算執行開銷,然後生成執行計畫,並將執行計畫快取在library cache中。

對Oracle收購BEA後的一點思考

相關新聞 oracle出價85億美元成功收購bea oracle公司宣布,該公司已經同bea達成協議,將以85億美元收購後者,而bea公司董事會也一致通過接受這一新的 塵埃終於落定,這場長達數月的收購大戰,最終以oracle成功入主bea而告終,但這場交易也被 稱為 重傷收購 每次收購都是幾家歡喜幾...

oracle一點記錄

檢視資料庫例項名 service name sql select instance name from v instance 如何知道oracle客戶端是32位還是64的。windows下啟動sqlplus,看到是sqlplus32即32位,看到sqlplus即是64位。pl sql在64為客戶端不...

今天看簡歷的一點感想

今天hr給我們部門送來一大堆今年應屆畢業生的簡歷。讓各個專案組挑選。看了一下午,有點感想.1.之前都說碩士今年難找工作,一直沒有對這個難找有個明確的概念。今天看了簡歷,我的天,全是碩士,本科生只有寥寥幾個。碩士真是比市場上的大白菜還普通。光是多,還不算,今天自己選了一下簡歷,才稍微明白了一下別人看簡...