设为首页 加入收藏

TOP

Oracle中游标Cursor使用实例(一)
2019-03-28 00:08:20 】 浏览:160
Tags:Oracle 中游 Cursor 使用 实例

Shared cursor:库缓存,sga中一块内存区域


会缓存存储目标sql的sql文本、解析树、该sql所涉及的对象定义、该sql所使用的绑定变量类型和长度,以及改sql的执行计划等信息。


Shared cursor又分为:parent cursor,child cursor


  分别在V$SQLAREA,V$SQL,V$SQLAREA用于查看parent cursor,V$SQL用于查看child cursor。


在Oracle数据库里,任意一个目标sql一定会同时对应两个shared cursor。Parent cursor会存储该sql的文本,sql真正的可以被重用的解析树和执行计划则存储在child cursor。


SQL> select empno,ename from emp;


SQL>  select sql_text,sql_id,version_count from v$sqlarea where sql_text like'select empno,ename from emp%';


SQL>  select plan_hash_value,child_number from v$sql where sql_id='78bd3uh4a08av';


PLAN_HASH_VALUE CHILD_NUMBER


--------------- ------------


    3956160932            0


针对不同的sql,都有不同的parent,child cursor


Oracle里的session cursor


 Session cursor:当前session解析和执行sql的载体,缓存在pga中


 Session cursor与session是一一对应的,不同的session之间的session cursor无法共享


 Session cursor是有生命周期,至少会经历一次open,parse,bind,execute,fetch和close


1 Oracle在解析和执行目标sql时,始终会先去当前session的pga中寻找是否有匹配的缓存session cursor


2 在当前session的pga中找不到匹配的缓存,Oracle就去缓存中寻找是否存在匹配的parent cursor,如果找不到,


Oracle就会生新生成一个session cursor和一对shared cursor。如果找到了匹配的parent cursor,Oracle会生成一个新的session cursor和child cursor(child cursor会被挂在之前找到的parent cursor上)。


3 如果session中没有找到匹配的session cursor,而找到了匹配的parent cursor和child cursor,Oracle会新生成一个session cursor,(软解析)


4 如果在session 中找到了匹配的session cursor,Oracle可以以重用找到匹配的session cursor,通过此可以直接访问到该sql的parent cursor(软软解析)


Session cursor的相关参数:


Open_cursors:用于设定单个session中同时能够以open状态并存的session cursor的个数


SQL> show parameter open_cursors;


NAME                                TYPE                  VALUE
------------------------------------ ---------------------- ------------------------------
open_cursors                        integer                300
SQL> select sid from v$mystat where rownum<2;


      SID
----------
        88
SQL> select count(*) from v$open_cursor where sid=88;


  COUNT(*)
----------
        3
SQL> select name,value from v$sysstat where name='opened cursors current';


NAME                                                                                                                VALUE
opened cursors current                                                                                        47
session_cached_cursor:用于设定单个session中能够以soft closed状态并存的session cursors的总数
SQL> show parameter session_cached_cursors;


NAME                                TYPE                &
Oracle中游标Cursor使用实例(一) https://www.cppentry.com/bencandy.php?fid=57&id=215996

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android SQLite 数据库学习 下一篇Oracle 11g 分区表创建(自动按年..