基于ORACLE SQL优化书读之cursor(1)_ORACLE

 

Oracle里的cursor

        cursor就是游标,是Oracle数据库中SQL解析和执行的载体。本质上来说可以将cursor理解成是c语言中的一种结构。

        Oracle数据库中的cursor分为两种类型:一种是shared cursor;另一种是session cursor。

 

shared cursor

基于ORACLE SQL优化书读之cursor(1)_ORACLE_02

         缓存在库缓存中的对象我们称之为库缓存对象(Library Cache Object),所有的库缓存对象都是以一种名为库缓存对象句柄(Library Cache Object Handle)的结构存储在库缓存中,Oracle是通过 访问相关的库缓存对象句柄来访问对应的库缓存对象的。

        现在存在的问题是-----Oracle是以一种什么样的方式来存储和访问库缓存对象句柄的?

        实际上,库缓存对象句柄是以哈希表的方式存储在库缓存中的,这意味着Oracle会通过相关的哈希运算来存储和访问对应的库缓存对象句柄。Shared Cursor所对应的库缓存对象句柄的Namespace属性的值是CRSR。

        Shared Cursor里会存储目标SQL的SQL文本,解析数,该SQL所涉及的对象定义,该SQL所使用的绑定变量类型和长度,以及该SQL的执行计划等信息。

        Oracle数据库中的Shared Cursor又细分为parent cursor(父游标)和child cursor(子游标)两种,通过分别查询视图v$sqlarea和v$sql来查看当前缓存在库缓存中的parent cursor和child cursor,其中v$sqlarea用于查看parent cursor,v$sql用于查看child cursor。

        parent cursor和child cursor结构用于,区别在于SQL的SQL文本存储在其parent cursor所对应库缓存句柄的属性name中,child cursor对应的库缓存对象句柄的name为空,而SQL的解析数和执行计划会存储在其child cursor所对应的库缓存对象句柄的heap 6中,同时Oracle会在该SQL所对应parent cursor的heap 0的child table中,存储从属于该parent cursor的所有child cursor库缓存对象句柄地址,这就意味着Oracle可以通过访问parent cursor的heap 0中的child table而依次顺序访问从属于该parent cursor的所有child cursor。

        这种结构也就决定了Oracle数据库里,任意一个目标SQL一定会同时对应两个shared cursor,其中一个是parent cursor,另外一个则是child cursor,parent cursor会存储该SQL的SQL文本,而该SQL真正的可以被重用的解析数和执行计划则存储在child cursor中。

        Oracle设计这种嵌套的parent cursor和child cursor并存的结构是为了能尽量减少对应的hash  bucket中库缓存对象句柄链表的长度。

------------------------------------------------------------------

not the ending!!

Please await the next chapter!!

本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。