Oracle Session Cursor

Session Cursor 是Oracle數據庫裏的第二種類型的Cursor,它當前Session解析和執行sql載體。Session Cursor緩存在PGA中,Shared 緩存在SGA中。

Session Cursor和 Session是一一對應的,不同的Session的Session Cursor之間是沒有辦法共享的。

Session Cursor是有生命週期的,每個Session Cursor在使用的過程中都至少會經歷一次
open parse bind execute fetch close階段。 用過的Session不一定緩存在PGA中,它取決於Session_Cached_Cursors的值是否大於0。

Session Cursor也是以哈希表的方式存放在PGA中,Oracle也會通過相應的哈希運算來存儲和訪問當前Session的PGA中對應的Session Cursor。

在緩存Session Cursor的哈希表的對應Hash Bucket中,Oracle會存儲目標sql對應的Parent Cursor的庫緩存對象句柄地址。

當目標sql以硬解析的方式解析和執行完畢後,這個目標sql所對應的Shared Cursor就已經被緩存在庫緩存中,它所對應的Session Cursor 也已經使用完畢,這時候存在如下兩種情況:

1 如果參數Session_cached_cursors 的值等於哦0,那麼Session Cursor就會正常執行Close操作。那麼當上述目標再次執行時,就會重新打開一個Session Cursor,並且經歷:open
parse bind execute fetch close階段。

2 如果參數 SESSION_CACHED_CURSORS 的值大於0,那麼當滿足一定的額外的條件時,Oracle就不會對Session Cursor 執行close操作,而是會將其標記爲Soft Closed,同時將其緩存在PGA中。這樣做的好處是,當目標sql再次執行時,Oracle已經不需要爲該sql再新生成一個Session Cursor了。 和軟解析相比,此時Oracle就省掉了Open 和close操作。剩下的parse bind exectue fetch 還需要執行的,這個過程稱爲軟軟解析

軟軟解析與軟解析比起來,其好處主要體現在如下幾個方面:

1 軟軟解析在對Session Cursor的使用方面比軟解析要好
因爲軟軟解析不需要重啓open一個 Session Cursor 和close Cursor。

2 軟軟解析對庫緩存相關latch的爭用方面會比軟解析要好。
因爲軟軟解析在獲取shared Cursor時,需要遍歷 bucket中的庫緩存對象句柄鏈了,因此就不需要持有庫緩存相關的latch了。在緩存Session Cursor的哈希表的對應的Hash Bucket中,Oracle已經存儲了目標sql對應的parent Cursor的庫緩存對象句柄地址了,因此此時可以直接訪問。

Session Cursor和shared Cursor之間的關聯關係總結如下;

無論是硬解析 、軟解析還是軟軟解析,Oracle在解析和執行目標sql時,始終會先去當前Session的PGA中尋找是否存在匹配的緩存Session Cursor

如果在PGA中找不到匹配的Session Cursor,Oracle就會去庫緩存是否存在匹配的Shared Cursor。如果找不到,就重新生成 Session Cursor 和一對Shared Cursor。如果只找到了Parent Cursor,而找不到Child Cursor,那麼就會生成相應的Child Cursor。這兩種情況對應的都是硬解析的過程。

如果在PGA中找不到匹配的Session Cursor,但是找到了shared Cursor,那麼就重新生成Session Cursor,這個過程就是軟解析。

如果在PGA中找到了匹配的Session Cursor,Oracle就可以通過這個Session Cursor直接訪問到sql對應的Parent Cursor,這個過程就是軟解析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章