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)