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

分类

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

【Oracle】Oracle Cursor(游标)

上一篇:Python3 Socket + Mysql的使用 - 基础案例


下一篇:多物种密码子偏好性(RSCU)绘图