Oracle硬解析,软解析,软软解析介绍
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硬解析,软解析,软软解析介绍的更多相关文章
- Oracle SQL的硬解析、软解析、软软解析
Oracle中每条sql在执行前都要解析,解析分为硬解析.软解析.软软解析. Oracle会缓存DML语句,相同的DML语句会进行软解析.但不会缓存DDL语句,所以DDL每次都做硬解析.硬解析是一个很 ...
- 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁
先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...
- [转帖]TPC-C解析系列01_TPC-C benchmark测试介绍
TPC-C解析系列01_TPC-C benchmark测试介绍 http://www.itpub.net/2019/10/08/3334/ 学习一下. 自从蚂蚁金服自研数据库OceanBase获得TP ...
- C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符
C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符如果PLSQL Develope能连接上而用代码无法连接上则可以考虑sqlnet.ora文件中是否有NAMES.D ...
- Java解析XML文件的常用方法介绍
XML是一个可扩展标记语言.很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助! 对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增 ...
- Spring PropertyResolver 占位符解析(一)API 介绍
Spring PropertyResolver 占位符解析(一)API 介绍 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...
- Android初级教程:Android中解析方式之pull解析
在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...
- xml之DOM方式解析,DOM4J工具解析原理
DOM解析原理: DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到x ...
- kubernetes源码解析---- apiserver路由构建解析(2)
kubernetes源码解析---- apiserver路由构建解析(2) 上文主要对go-restful这个包进行了简单的介绍,下面我们通过阅读代码来理解apiserver路由的详细构建过程. (k ...
随机推荐
- linux-Navicat 连接数据库 报错10060 & Navicat连接报错1146
1.mysql数据库设置远程连接权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;[回 ...
- js node.js 编写命令工具demo
1 创建文件夹cli-demo 2 执行npm init 3 创建cli.js 文件 内容如下: //js文件变成可执行文件 #!/usr/bin/env node console.log(&quo ...
- Java成神之路技术整理(长期更新)
以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 ...
- 用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS
本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...
- 找不到servlet对应的class
javax.servlet.ServletException: Wrapper cannot find servlet class com.suntomor.lewan.pay.NotifyRecei ...
- vue项目实现记住密码功能
一.谷歌浏览的残留问题 现在很多的网站都有一个需求是记住密码这个功能,为的是避免用户下次登录的时候繁琐的输入过程. 像是一些主流的浏览器(比如Chrome)都有了这个功能,而且如果你登录了Chrom ...
- Java进阶篇设计模式之四 -----适配器模式和桥接模式
前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...
- 使用 ASP.NET Core MVC 创建 Web API(二)
使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...
- .NET CORE 中使用AutoMapper进行对象映射
简介 AutoMapper uses a fluent configuration API to define an object-object mapping strategy. AutoMappe ...
- Eclipse目录实解
从左1图中可以看到,其中的src/main/java存放java文件,src/main/resources存放项目用到的资源(js,css,图片,文件等).下面的两个文件夹是用来存放测试文件和资源的( ...