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. .NET 机器学习生态调查

    机器学习是一种允许计算机使用现有数据预测未来行为.结果和趋势的数据科学方法. 使用机器学习,计算机可以在未显式编程的情况下进行学习.机器学习的预测可以使得应用和设备更智能. 在线购物时,机器学习基于历 ...

  2. Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)

    WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...

  3. Docker & ASP.NET Core (3):发布镜像

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 上一篇文章最后有个问题,定制的镜像无法正常运行: 这可能是由于无法找到要运行的dll引起的问题. 之前的Dockerfile的文档我是按照微软的 ...

  4. python内置方法大全

    数学运算 abs:求数值的绝对值 >>> abs(-2) 2 divmod:返回两个数值的商和余数 >>> divmod(5,2) (2, 1) >> ...

  5. 文本离散表示(二):新闻语料的one-hot编码

    上一篇博客介绍了文本离散表示的one-hot.TF-IDF和n-gram方法,在这篇文章里,我做了一个对新闻文本进行one-hot编码的小实践. 文本的one-hot相对而言比较简单,我用了两种方法, ...

  6. 【Android Studio安装部署系列】十、Android studio打包发布apk安装包

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 使用Android studio发布apk安装包的操作步骤. 开始打包发布apk Build > Generate Signe ...

  7. Elasticsearch的基本概念和指标

    背景 在13年的时候,我开始负责整个公司的搜索引擎.嗯……,不是很牛的那种大项目负责人.而是整个搜索就我一个人做.哈哈. 后来跳槽之后,所经历的团队都用Elasticsearch,基本上和缓存一样,是 ...

  8. 美团分布式服务通信框架及服务治理系统OCTO

     一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...

  9. el-upload 上传文件和上传图片的基本用法

    el-upload 上传excel <template> <el-form :model="form"> <el-form-item label=&q ...

  10. 浅析HttpSession

    苏格拉底曰:我唯一知道的,就是自己一无所知 源头 最近在翻阅Springboot Security板块中的会话管理器过滤器SessionManagementFilter源码的时候,发现其会对单用户的多 ...