Oracle数据库中的CURSOR分为两种类型:Shared Cursor 和 Session Cursor

1,Shared Cursor

Oracle里的第一种类型的Cursor就是Shared Cursor。 它是存在Shared Pool里,Shared Pool 是SGA里的里的一块内存区域,Shared Pool(Library Cache & Data Dict Cache)。 Library Cache缓存的是刚刚执行过的SQL语句和PL/SQL语句(procedure,function, package and trigger)所对应的执行计划,解析数(parse tree).Pcode,Mcode等对象。缓存在库缓存中的对象我们称它为库缓存对象(Library Cache Object). Oracle数据库中的Shared Cursor又细分为Parent Cursor(父游标)和Child Cursor(子游标). 这两种类型。我们可以通过查询V$SQLAREA和 V$SQL 来查看当前缓存中的Parent Cursor和 Child Cursor。其中V$SQLAREA用于查看Parent Cursor, V$SQL用于查看Child Cursor. 在ORACLE数据库里,任意一个目标SQL 一定会同时对应两个Shared Cursor,其中一个是Parent Cursor,另外一个是Child Cursor. Parent Cursor会存储该SQL 的SQL 文本,而该SQL 真正的可以被重用的解析数和执行计划则存储在Child Cursor中。

2,Session Cursor

Oracle里的第二种类型的Cursor就是Session Cursor。它是当前Session解析和执行SQL的载体,换句话说,Session Cursor用于在当前Session中的解析和执行SQL,它和Shared Cursor的区别是,它是缓存在PGA中,而不是像Shared Cursor那样缓存在SGA的库缓存里。

Session Cursor与Session是一一对应的,不同的session的Session Cursor直接没有办法共享,这个和Shared Cursor有本质的区别。Session Cursor是有生命周期的,每个session都在使用的过程中都至少会经历一场(open,parse,bind,execute,fetch and Close)中的一个或者多个阶段。用过的Session Cursor不一定缓存在对应的Session 的PGA中,这取决于Session_cached_cursor的值是否大于0.Oracle在解析和执行目标SQL时,会先去当前的SESSION的PGA中找是否有匹配的缓存的Session Cursor.当第一次解析和执行目标SQL时(显然是硬解析),当前SESSION的PGA中肯定不存在匹配的SESSION CURSOR,这个时候ORACLE 会新生成一个Session Cursor和一对Shared Cursor(即Parent Cursor 和 Child Cursor),这其中的Shared Cursor会存储能被所有Session共享,重用的内容(比如目标SQL的解析树,执行计划等),而Session Cursor则会经历一次open,parse,bind,execute,fetch和close中的一个或多个阶段。显然一个Session Cursor 只能对应一个Shared Cursor, 而一个Shared Cursor却可以同时对应多个Session Cursor.

硬解析:目标SQL第一次解析和执行,会同时生成Session Cursor和一对Shared Cursor(Parent Cursor and Child Cursor)

软解析:Session_Cached_Cursors=0,那么Session Cursor就会正常的执行Close操作,当上述的SQL再次重复执行时,是可以找到匹配的Shared Cursro但是找不到 Session Cursor了,这就意味着ORACLE 还必须为该SQL 新生成一个Session Cursor.

软软解析: Session_Cached_Cursor>0,那么满足一定的额外条件时,Oracle就不会对Session Cursor执行CLOSE操作,而是会将其标记为Soft Closed,同时将其缓存在当前的Session 的PGA中。这样做的好处是,当目标SQL 再次被重复执行时,此时的Shared Cursor 和Session Cursor都能匹配到。意味着ORACLE 不需要为该SQL 生成新的Session Cursor了,而是只需要从当前SESSION 的PGA中将之前已经标记为Soft Closed的匹配Session Cursor直接拿过来用就可以了。和软解析相比,此时ORACLE省掉了OPEN一个新的Session Cursor所需要耗费的资源和时间,另外,close 一个现有Session Cursor也不用做了(只需要把他标记为Soft Closed,同时将其缓存在当前的SESSION的PGA中就可以了),当然剩下的Parse, Bind,Execute,Fetch还是需要做的,这个过程就是软软解析。

总上所述,我们对Sesion Cursor和Shared Cursor之间的关联关系有如下总结:

无论是硬解析,软解析还是软软解析,ORACLE在解析和执行目标SQL时,始终会先去当前SESSION的PGA中寻找是否存在匹配的缓存Session Cursor.

1,如果在当前SESSION 的PGA中找不到匹配的缓存Session Cursor, Oracle就会去库缓存中找是否存在匹配的Parent Cursor。如果找不到,Oracle就会新生成一个Session Cusor 和一对 Shared Cursor(Parent Cursor and Child Cursor),如果找到了匹配的Parent Cursor,但是找不到匹配的Child Cursor, Oracle就会去新生成一个Session Cursor和一个Child Cursor(这个Child Cursor会被挂在之前找到的匹配Parent Cursor下),无论哪一种情况,这两个过程对应的都是硬解析。

2, 如果在当前Session的PGA中找不到匹配的缓存 Session Cursor,但在库缓存中找到了匹配的Parent Cursor和Child Cursor,则Oracle会新生成一个Session Cursor并重用刚刚找到的匹配Parent Cursor和 Child Cursor,这个过程就是软解析。

3,如果在当前Session的PGA中找到了匹配的缓存Session Cursor,此时就不再需要新生成一个Session Cursor,并且也不再需要向软解析那样得去库缓存中查找匹配的Parent Cursor了,因为ORACLE此时可以重用找到的匹配 Session Cursor,并可以通过这个Session Cursor直接访问到该SQL对应的Parent Cursor,这个过程就是软软解析。

Oracle硬解析,软解析,软软解析介绍的更多相关文章

  1. Oracle SQL的硬解析、软解析、软软解析

    Oracle中每条sql在执行前都要解析,解析分为硬解析.软解析.软软解析. Oracle会缓存DML语句,相同的DML语句会进行软解析.但不会缓存DDL语句,所以DDL每次都做硬解析.硬解析是一个很 ...

  2. 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

    先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...

  3. [转帖]TPC-C解析系列01_TPC-C benchmark测试介绍

    TPC-C解析系列01_TPC-C benchmark测试介绍 http://www.itpub.net/2019/10/08/3334/ 学习一下. 自从蚂蚁金服自研数据库OceanBase获得TP ...

  4. C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符

    C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符如果PLSQL Develope能连接上而用代码无法连接上则可以考虑sqlnet.ora文件中是否有NAMES.D ...

  5. Java解析XML文件的常用方法介绍

    XML是一个可扩展标记语言.很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助! 对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增 ...

  6. Spring PropertyResolver 占位符解析(一)API 介绍

    Spring PropertyResolver 占位符解析(一)API 介绍 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...

  7. Android初级教程:Android中解析方式之pull解析

    在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...

  8. xml之DOM方式解析,DOM4J工具解析原理

    DOM解析原理: DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到x ...

  9. kubernetes源码解析---- apiserver路由构建解析(2)

    kubernetes源码解析---- apiserver路由构建解析(2) 上文主要对go-restful这个包进行了简单的介绍,下面我们通过阅读代码来理解apiserver路由的详细构建过程. (k ...

随机推荐

  1. Java引用详解-StrongReference SoftReference WeakReference PhantomReference

    1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:    强引用  >  软引用  >  弱引用  >  虚引用 ⑴强引用(StrongR ...

  2. T5大牛带你解析:如何实现分布式技术

    1.分布式事务 2. 分布式锁 Java 原生 API 虽然有并发锁,但并没有提供分布式锁的能力,所以针对分布式场景中的锁需要解决的方案. 分布式锁的解决方案大致有以下几种: 基于数据库实现 基于缓存 ...

  3. Go语言strings包

    目录 strings包实现了用于操作字符的简单函数. func EqualFold 判断两个utf-8编码字符串(将unicode大写.小写.标题三种格式字符视为相同)是否相同. func Equal ...

  4. 图解 -- Win10 OpenSSH

    一.安装OpenSSH 客户端 .OpenSSH 服务器 设置 -> 管理可选功能 -> 添加功能 -> [OpenSSH 客户端]   [OpenSSH 服务器]  1.设置 2. ...

  5. 解决Linux启动redis时出现提示权限不够问题

    如果权限不够请使用一条命令 chmod 777  操作 参考:https://blog.csdn.net/zczzsq/article/details/8162339

  6. 没错,老板让我写个 BUG!

    前言 标题没有看错,真的是让我写个 bug! 刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动.这可是我特长啊:终于可以光明正大的写 bug 了

  7. NetStateReceiver【监听网路状态变化】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 用来监控网络变化时的处理,一般用来toast提示或者扩展为其他作用. 效果图    代码分析 NetStateReceiver:网络 ...

  8. Matlab图像处理常用基本函数

    之前用Matlab做图像处理工作时,用到什么函数就查什么函数,从没做过系统的总结,再做的时候又要去查,所以总结还是有必要的~ 为了方便,在此只列出函数名和基本用法,如不特别指出,不详细说明参数,辅助h ...

  9. 深入Go的底层,带你走近一群有追求的人

    目录 缘起 自我介绍的技巧 硬核知识点 什么是plan9汇编 汇编角度看函数调用及返回过程 汇编角度看slice 正确参与Go夜读活动的方式 阅读原文 上周六晚上,我参加了"Go夜读&quo ...

  10. C# 委托链(多播委托)

    委托既可以封装一个方法,又可以对同一类型的方法进行封装,它就是多播委托 using System; using System.Collections.Generic; using System.Lin ...