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#
发布评论