sql 游标结果放进表中_理解Oracel游标CURSOR参数和相关视图V$OPEN_CURSOR

1主题

理解游标CURSOR,OPEN_CURSORS参数

以及视图V$OPEN_CURSOR, V$SESSION_CACHED_CURSOR

2游标概念

595014b9d6e7067b9247144617c8ca08.png

游标的作用就是用于临时存储从数据库中提取的数据块,由系统或用户以变量的形式定义。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。

Cursor游标分两种,一种是Shared cursor,位于SGA的一种library cache object,通常我们所说的SQL的父cursor,child cursor就是指这一类; 另一种是Session cursor,是SQL的一个内存工作区(或者内存结构),位于PGA的UGA部分,为了使每一个SQL的会话拥有单独的1个私有SQL区(PrivateSQL Area),一次只处理1个SQL,私有SQL区包含了绑定变量信息及运行时期内存结构。一个session cursor只能对应一个shared cursor,而一个shared cursor却可能同时对应多个session cursor。通常open_cursors参数配置的便是1个session的最大Session cursors。即1个session最多可以拥有多少个PrivateSQL Area,直白一点就是1个session最多能在UGA保存多少个不同的SQL语句的信息(包括绑定变量信息,与Shared cursor的关联信息),超过则一些执行频度低的游标会关闭。

“软软解析”:

当某个session cursor和其对应的shared cursor建立关联后,如果把cursor_space_for_time调成true(有利有弊,需要SGA和PGA都足够大),当一个session cursor处理完一条sql后,它就不会被destroy,Oracle会把其cache起来(我们称之为soft closed session cursor),这么做的目的是很明显的,因为这个soft closed掉的sessioncursor已经和包含其执行计划和parse tree的shared cursor建立了联系,那么当在这个session中再次执行同样的sql的时候,Oracle就不再需要去扫描library cache了,直接把刚才已经soft closed掉的session cursor拿过来用就好了,这就是所谓的软软解析。

3 查询opened cursors

2067ab38a061951548e2a1cdd029b6f4.png

3.1OPEN_CURSOR,定义每个Session最大能够打开的游标数量。在init.ora文件中定义,可以通过

select * from v$parameter where name = 'open_cursors'

查询。

查询真正意义上的打开着的游标:

select sum(a.value), b.namefrom v$sesstat a, v$statname bwhere a.statistic# = b.statistic#and b.name = 'opened cursors current'group by b.name;

3.2 V$OPEN_CURSOR,包含多种CURSOR_TYPE的游标SESSION CURSOR CACHED,包括;可以通过以下SQL查询当前系统的游标类型及数量:

select kgllkmod, kgllkctp, count(*) from X$KGLLK where KGLHDNSP = 0 group by kgllkmod, kgllkctp; KGLLKMOD KGLLKCTP COUNT(*) ---------- --------------------------- ---------- 1 SESSION CURSOR CACHED 32 1 DICTIONARY LOOKUP CURSOR CACHED 96 1 OPEN-RECURSIVE 42 1 PL/SQL CURSOR CACHED 19 1 OPEN 216

而不是曾经打开的游标。 V$SESSION_CACHED_CURSOR,当前Session已经关闭并被缓存的游标。

3.3 V$OPEN_CURSOR中显示的当前Session游标缓存中游标,如果要精确查询当前Session打开的游标总数,需要从V$SESSTAT中查询。

select a.value, s.username, s.sid, s.serial# from v$sesstat a, v$statname b, v$session s where a.statistic# = b.statistic# and s.sid=a.sid and b.name = 'opened cursors current'; 
cd9b3e39e77ddeb92308afefe1bd7ddb.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值