【DB筆試面試577】在Oracle中,遊標有哪幾類?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

♣          題目         部分

在Oracle中,遊標有哪幾類?數據庫


     
♣          答案部分          


遊標(Cursor)是Oracle數據庫中SQL解析和執行的載體,它能夠分爲共享遊標(Shared Cursor)和會話遊標(Session Cursor)。共享遊標是指緩存在庫緩存(Library Cache)裏的一種庫緩存對象,其實就是指緩存在庫緩存裏的SQL語句和匿名PL/SQL塊所對應的庫緩存對象。共享遊標是Oracle緩存在庫緩存中的幾十種庫緩存對象之一,它所對應的庫緩存對象句柄的Namespace屬性的值是CRSR(也就是Cursor的縮寫)。共享遊標會存儲目標SQL的SQL文本、解析樹、該SQL所涉及的對象定義、該SQL所使用的綁定變量類型和長度,以及該SQL的執行計劃等信息。共享遊標能夠細分爲父遊標(Parent Cursor)和子游標(Child Cursor),能夠經過視圖V$SQLAREA來查看當前緩存在庫緩存(Library Cache)中的父遊標,而經過V$SQL來查看緩存在庫緩存中的子游標。Oracle設計這種嵌套的Parent Cursor和Child Cursor並存的結構是爲了能儘可能減小對應的Hash Bucket中庫緩存對象句柄鏈表的長度。緩存

Oracle中游標的分類以下圖所示:ide

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

圖 3-13 Oracle中的遊標分類spa

父遊標和子游標的對好比下表所示:設計


父遊標(Parent Cursor)對象

子游標(Child Cursor)blog

查詢視圖it

V$SQLAREAio

V$SQLtable

存儲內容

父遊標存儲SQL文本(庫緩存對象句柄的屬性NAME中);父遊標的 heap 0 中存儲着子游標的句柄地址。

子游標存儲解析樹(Parse Tree)及執行計劃(Execution Plan,實際上存儲在庫緩存對象句柄的heap 6中),以及該SQL所使用的綁定變量的類型和長度。

庫緩存對象句柄的屬性NAME存儲內容

存儲SQL文本

聯繫

1.父遊標和子游標的結構是同樣的,它們都是以庫緩存對象句柄的方式緩存在庫緩存中,Namespace屬性的值均爲CRSR。

2.因爲子游標所對應的庫緩存對象句柄的NAME屬性值爲空,因此,只能經過父遊標才能找到相應的子游標。

3.任意一個通過解析的目標SQL必定會同時對應兩個共享遊標(Shared Cursor),一個是父遊標(Parent Cursor),另外一個則是子游標(Child Cursor)。

Oracle在解析目標SQL時去庫緩存中查找匹配Shared Cursor的過程以下圖所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 


從上圖能夠看出,Oracle在解析目標SQL時去庫緩存中查找匹配共享遊標(Shared Cursor)的過程包含以下幾個步驟:

(1)根據目標SQL的SQL文本的哈希值去庫緩存中查找匹配的Hash Bucket。

(2)而後在匹配的Hash Bucket的庫緩存對象鏈表中查找匹配的父遊標(Parent Cursor),固然,在查找匹配Parent Cursor的過程當中確定會比對目標SQL的SQL文本(由於不一樣的SQL文本計算出來的哈希值多是相同的)。

(3)在步驟(2)中,若是找到了匹配的父遊標,那麼Oracle接下來就會遍歷從屬於該父遊標的全部子游標以查找匹配的子游標。若是找不到匹配的父遊標,那麼也意味着此時沒有能夠共享的解析樹和執行計劃,Oracle就會從頭開始解析上述目標SQL,新生成一個父遊標和一個子遊標,並把它們掛在對應的Hash Bucket中。在匹配的父遊標中查找匹配的子游標時,若是找到了匹配的子游標,那麼Oracle就會把存儲於該子游標中的解析樹和執行計劃直接拿過來重用,而不用再從頭開始解析。若是找不到匹配的子游標,那麼意味着沒有能夠共享的解析樹和執行計劃,接下來Oracle也會從頭開始解析上述目標SQL,新生成一個子遊標,並把這個子游標掛在對應的父遊標下。

相關文章
相關標籤/搜索