【Oracle】Cursor(游标)

【Oracle】Cursor(游标)

Cursour(游标)是Oracle数据库中解析SQL和执行SQL的载体。

Shared Cursor

定义

Shared Cursor 是指缓存在库缓存里 SQL 语句和匿名 PL/SQL 对应的 SQL 文本、解析树、目标 SQL 涉及的对象、目标 SQL 中的绑定变量及 SQL 的执行计划等信息。

查询方式

Shared Cursor 又细分为 Parent Cursor(父游标)和 Child Cursor(子游标)两种。V$SQLAREA 可查看 Parent Cursor,V$SQL 可查看 Child Cursor(CHILD_NUMBER 值从 0 开始)。Parent Cursor 和 Child Cursor 均已库缓存对象句柄的方式缓存在库缓存中,Namespace 为 CRSR。

父子游标的区别和联系

  1. 目标 SQL 的 SQL 文本存储在 Parent Cursor 所对应库缓存对象句柄的 Name 属性中,Child Cursor 的 Name 属性为空;
  2. 目标 SQL 的解析树和执行规则会存储在 Child Cursor 对应库缓存对象句柄的 Heap 6 中;
  3. Parent Cursor 的 Heap 0 中存储了该父游标对应的所有子游标库缓存对象句柄地址。

缘由

由于不同目标 SQL 的文本对应的哈希值可能相同,且同一个目标 SQL 也可能存在多份不同的解析树和执行计划。为了尽量减少对应 Hash Bucket 中库缓存对象句柄链表的长度,同时减少 Oracle 检索库缓存对象句柄链表所消耗的时间和工作量,Oracle 父子游标并存的结构一直延续至今。

Session Cursor

说明

Session Cursor 是解析和执行 SQL 的载体,Session Cursor 也是以哈希表的方式缓存起来,只不过是缓存在 PGA 中。

注意事项
  1. Session Cursor 和 Session 一一对应,不同的 Session 的 Session Cursor 之间没法共享
  2. Session Cursor 有生命周期,在使用过程中都至少会经历一次 Open、Parse、Bind、Execute、Fetch 和 Close 中的一个或多个阶段
  3. Session Cursor 也是以哈希表的方式缓存在 PGA 中,Oracle 会同样根据哈希运算来存储和访问当前 Session 对应 PGA 中 Session Cursor
  4. 一个 Session Cursor 对应一个 Shared Cursor,一个 Shared Cursor 可以同时对应多个 Session Cursor
  5. 一个 Session Cursor 能够被缓存在 PGA 中的必要条件是该 Session Cursor 所对应的 SQL 解析和执行次数要超过 3 次

作用

  • 解析和执行目标 SQL
  • Oracle 依靠 Session Cursor 将目标 SQL 所涉及的数据从 Buffer Cache 的对应数据块读到 PGA,然后 PGA 做后续处理(排序、表连接)

相关参数

参数描述
OPEN_CURSORS设定单个 Session 中同时以 Open 状态并存的 Session Cursor 的总数
SESSION_CACHED_CURSORS设定单个 Session 中能够以 Soft Closed 状态并存的 Session Cursor 总数
CURSOR_SPACE_FOR_TIMEOracle 11gR1 之前的版本用来减少库缓存相关 Latch 争用,副作用是增加 Shared Pool 压力

分类

  1. 隐式游标(Implicit Cursor)
  2. 显式游标(Explicit Cursor)
  3. 参考游标(Ref Cursor)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的向往

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值