2024年5月9日发(作者:)

理解游标CURSOR,OPEN_CURSORS参数

以及视图V$OPEN_CURSOR, V$SESSION_CACHED_CURSOR

游标概念:

游标的作用就是用于临时存储从数据库中提取的数据块,由系统或用户以变量的形式

定义。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后

将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘

数据交换会降低效率。

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的关联信息),超过则一些执行频度低

的游标会关闭。

私有SQL区包括

永久区:包含绑定变量信息。当游标关闭时被释放。

运行区:当执行结束时释放。

“软软解析”:

当某个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拿过来用就好了,这就是所谓的软

软解析。

查询opened cursors

OPEN_CURSOR,定义每个Session最大能够打开的游标数量。在文件中定

义,可以通过select * from v$parameter where name = 'open_cursors'查询。

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

select sum(),

from v$sesstat a, v$statname b

where tic# = tic#