专栏首页小麦苗的DB宝专栏【DB笔试面试577】在Oracle中,游标有哪几类?

【DB笔试面试577】在Oracle中,游标有哪几类?

题目部分

在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中游标的分类如下图所示:

图 3-13 Oracle中的游标分类

父游标和子游标的对比如下表所示:

父游标(Parent Cursor)

子游标(Child Cursor)

查询视图

V$SQLAREA

V$SQL

存储内容

父游标存储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的过程如下图所示:

从上图可以看出,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,新生成一个子游标,并把这个子游标挂在对应的父游标下。

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文分享自微信公众号 - DB宝(xiaomaimiaolhr),作者:小麦苗best

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【DB笔试面试578】在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?

    在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?

    小麦苗DBA宝典
  • 【DB笔试面试396】在Oracle中,声明游标时指定的SELECT语句必须带有下边选项中的哪一个子句()

    在Oracle中,当需要使用显式游标更新或删除游标中的行时,声明游标时指定的SELECT语句必须带有下边选项中的哪一个子句()

    小麦苗DBA宝典
  • 【DB笔试面试579】在Oracle中,SQL的解析过程的硬解析、软解析和软软解析的区别有哪些?

    在Oracle中,每条SQL语句在正式执行之前都需要经过解析(Parse),根据解析的过程可以分为3种类型:硬解析(Hard Parse)、软解析(Soft P...

    小麦苗DBA宝典
  • 【DB笔试面试578】在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?

    在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?

    小麦苗DBA宝典
  • mongo中游标

        mongo中我们常用的查询方式db.collection.find()方法其实返回的就是游标,只不过我们并未给返回的游标分配变量,我们所看到的的查询数据...

    莫问今朝
  • MySQL从删库到跑路_高级(九)——存储过程

    游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 尽管游标能遍历结果中的所有行,...

    良月柒
  • Oracle的静态游标与动态游标

    我们在写Oracle的存储过程里面,经常会用到游标,Oracle里面的游标分为静态游标和动态游标。今天我们在说一下分别有什么不同。

    Vaccae
  • ​【数据库】MySQL进阶三、游标简易教程

    【数据库】MySQL进阶三、游标简易教程 mysql游标简易教程 从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存...

    奋斗蒙
  • 玩转Mysql系列 - 第19篇:游标详解

    此时我们需要使用游标,通过游标的方式来遍历select查询的结果集,然后对每行数据进行处理。

    路人甲Java
  • 有坑勿踩(二): 关于游标

    聊一聊一个最基本的问题,游标的使用。可能你从来没有注意过它,但其实它在MongoDB的使用中是普遍存在的,也存在一些常见的坑需要引起我们的注意。

    MongoDB中文社区

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动