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_TIME Oracle 11gR1 之前的版本用来减少库缓存相关 Latch 争用,副作用是增加 Shared Pool 压力

分类

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