Oracle 库缓存 和shared Cursor (下)

Shared Cursor是Oracle库缓存对象中的一种。

是指缓存在库缓存里的sql语句和匿名sql语句所对应的库缓存对象。
Shared Cursor 会存储目标sql的sql执行文本、解析树、该sql所涉及的对象定义、该sql所使用的绑定变量的类型和长度、以及该sql的执行计划。

Shared Cursor分为partent cursor 和child cursor。
它们的区别在于:目标sql的sql文本会存储在Parent Cursor 所对应的库缓存对象句柄的属性Name中。 sql的解析树和执行计划存储在child Cusor所对应的库缓存对象句柄的Heap 6中, 同时Oracle会在该sql所对应的Partent Cursor的heap 0 的child table中,存储从属于该Parent Cursor的所有Child Cursor的库缓存对象句柄地址。

在Oracle数据库里任意一条sql都会同时对应两个shared Cursor : parent cursor 和child cursor。

一个Partent Cursor可能会有多个child Cursor,因为一个sql可能会有多个执行计划。

Oracle 在解析目标sql时去库缓存中查找匹配shared Cursor的过程的步骤如下顺序:

1:根据目标sql的哈希值去库缓存中找匹配的hash Bucket。
2:然后在hash bucket的 库缓存对象句柄链表中查找匹配的Partent Cursor。
3如果找到了Parent Cursor ,接下来就在 child table中查找匹配的child Cursor.
4 如果找不到 Parent Cursor,则意味着没有共享的解析树和执行计划,需要重新开始解析目标sql,新生成一个Parent Cursor 和child 和Cursor。

5如果在第三步没有找到child Cursor,也要重新解析目标,生成一个child cursor,挂在对应Parent Cursor上。

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