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。
父子游标的区别和联系
- 目标 SQL 的 SQL 文本存储在 Parent Cursor 所对应库缓存对象句柄的 Name 属性中,Child Cursor 的 Name 属性为空;
- 目标 SQL 的解析树和执行规则会存储在 Child Cursor 对应库缓存对象句柄的 Heap 6 中;
- Parent Cursor 的 Heap 0 中存储了该父游标对应的所有子游标库缓存对象句柄地址。
缘由
由于不同目标 SQL 的文本对应的哈希值可能相同,且同一个目标 SQL 也可能存在多份不同的解析树和执行计划。为了尽量减少对应 Hash Bucket 中库缓存对象句柄链表的长度,同时减少 Oracle 检索库缓存对象句柄链表所消耗的时间和工作量,Oracle 父子游标并存的结构一直延续至今。
Session Cursor
说明
Session Cursor 是解析和执行 SQL 的载体,Session Cursor 也是以哈希表的方式缓存起来,只不过是缓存在 PGA 中。
注意事项
- Session Cursor 和 Session 一一对应,不同的 Session 的 Session Cursor 之间没法共享
- Session Cursor 有生命周期,在使用过程中都至少会经历一次 Open、Parse、Bind、Execute、Fetch 和 Close 中的一个或多个阶段
- Session Cursor 也是以哈希表的方式缓存在 PGA 中,Oracle 会同样根据哈希运算来存储和访问当前 Session 对应 PGA 中 Session Cursor
- 一个 Session Cursor 对应一个 Shared Cursor,一个 Shared Cursor 可以同时对应多个 Session Cursor
- 一个 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 压力 |
分类
- 隐式游标(Implicit Cursor)
- 显式游标(Explicit Cursor)
- 参考游标(Ref Cursor)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 宸汐缘!
评论