共享内存shared pool (5):详解一条SQL在library cache中解析
前面介绍的 shared pool,library cache结构,都是为了说明一条SQL是如何被解析的。先看下面的图:

图中涉及的各结构简单介绍
- 父HANDLE,里面有父游标堆0的地址。。
- 父游标堆0:有指向一个或多个子游标的HANDLE的句柄地址
- 父游标在第一次打开时被锁定,直到其他所有的session都关闭该游标后才被解锁。当父游标被锁定的时候是不能被交换出librarycache的,只有在解锁以后才能被交换出library cache。父游标被交换出内存时父游标对应的所有子游标也被交换出library cache。
- 子游标的HANDLE:有子游标堆0地址
- 子游标堆0:有SQL语句依赖关系,并指向子游标的堆6
- 子游标堆6:存有SQL语句的执行计划
- 子游标随时可以被交换出library cache。当子游标被交换出library cache时,oracle可以利用父游标的信息重新构建出一个子游标出来,这个过程叫做reload(重载)。
SQL语句在Library cache执行的第一次检查过程:
- 通过语法语义权限等检查的SQL语句进入Library cache
- 将SQL文本转化为ASCII值(大小写ASCII不同)并进行hash函数的运算
- 得到一个HASH值对应到hash bucket的号码
################以上检查通过后,进入以下解析过程################
软软解析
就是SQL执行3次,被缓存。第四次,就是软软解析了(不做详细论述)
####################################################
软解析
- 获得library cache Latch ---如未获得将产生:Latch:library cache2.获得library cache lock,检索bucket上的父游标handle,得到所指向的父游标堆0-LCO的内存地址。
- 获得library cache pin,读取父游标堆0-LCO,得到子游标handle地址。
- 获得library cache lock,检索子游标handle,得到所指向的子游标堆0-子LCO的内存地址。
- 获得library cache pin,读取子游标堆0-子LCO从而得到子游标堆6地址。
- 读取子游标堆6,得到SQL执行计划。
###找到child lco后,增加parsecount(total)统计值。
- SQL开始执行:此时以共享模式获得library cache lock和library cache pin,并执行SQL。
- FETCH阶段:执行完成进入FETCH阶段,SQLCURSOR将library cache lock转换为null模式,释放library cache pin。
###############################################################
在尝试软解析时
--如果未检索到相同的父游标LCO或子游标LCO时,发生硬解析。
--如果子游标堆6上不能加共享library cachepin或者child lco中信息不完整,需要重建执行计划--记录为硬解析。
###############################################################
硬解析:
如果未检索到相同的父游标LCO或子游标LCO时,发生硬解析。进程会一直持有library cache latch,直到硬解析结束为止。
- 获取shared pool latch,从freelist的bucket上查找合适大小的CHUNK。不存在大小合适的CHUNK会分割大CHUNK,剩余的会再进入相应的BUCKET。如果不能从free list的bucket上查找到合适大小的CHUNK,则进入 lru list;如果仍不能获取到CHUNK,则从shared pool剩余内在中分配。如果CURSOR达到_shared_pool_reserved_min_alloc隐含参数的大小标准(11.2.0.4中是4400),则从保留池中分配CHUNK;如 果这些分配CHUNK操作都失败,报错:ORA-04031。如bucket列表过长或者碎片严重,产生latch:shared pool争用。
- 分配到CHUNK后。获得library cachelock--独占模式,创建父游标handle
- 获得library cache pin,创建父游标堆0-父LCO的信息。--library cache lock转为NULL
- 获得library cache lock,创建子游标handle
- 获得library cache pin,创建子游标堆0-子LCO的信息。
- library cache pin,创建子游标堆6-执行计划的信息(通过优化器创建一个最优的执行计划,这个过程会根据数据字典里面记录的对象的统计信息,来计算最优的执行计划,这一步涉及的运算量很大,最耗CPU资源)。
- SQL开始执行:此时以共享模式获得library cache lock和library cache pin,并执行SQL。
- FETCH阶段:执行完成进入FETCH阶段,SQLCURSOR将library cache lock转换为null模式,释放library cache pin。
关于MUTEX与图中librarycache Latch/PIN/LOCK的对应
关于MUTEX,可以简单的把library cache Latch/PIN/LOCK当做MUTEX的不同模式来套入此步骤。
在10G中,Mutex主要保护 handle和LCO---替代library cache PIN/LOCK
在11G中,Mutex可以保护bufket上链表,handle和LCO---替代library cache Latch/PIN/LOCK
句柄上访问竞争:Cursor:mutex 堆的访问竞争:Cursor:pin
解析时MUTEX的相关争用
相关锁
(1)、计算HASH值,找到Bucket,搜索HASH链表,查找句柄。
LIbrary Cache Latch(11G后被Mutex取代)
(2)、在父游标句柄中查找父游标堆0
mutex(取代Library cache lock latch) ,Library cache lock
(3)、在父游标堆0中,查找子游标句柄。
两次mutex。两种类型的Mutex。取代了Librarycache pin latch和Library cache pin 。
(4)、在子游标句柄中,查找子游标堆0地址。
mutex(取代Library cache lock latch) ,Library cachelock
(5)、在子游标堆0中,查找子游标堆6地址。
一次mutex。取代了Librarycache pin latch和Library cache pin 。
(6)、在子游标堆6中,读取SQL执行计划。
一次mutex。取代了Librarycache pin latch和Library cache pin 。
参考blog:
http://blog.csdn.net/haibusuanyun/article/details/21402787
共享内存shared pool (5):详解一条SQL在library cache中解析的更多相关文章
- 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁
先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...
- 共享内存shared pool (6):追踪sql语句
构建实验数据 --使用NC50用户查询(会话1) SQL> conn NC50/NC50 Connected. SQL> create table emp as select * from ...
- 共享内存shared pool (3):Library cache
Shared pool物理层面上由许多内存块(chunck)组成.从逻辑功能划分,Shared pool主要由三部分组成:Library cache,Dictionary cache和Control ...
- 共享内存shared pool (4):Library cache 转储文件
上一篇blog只是从概念上理解Library cache,本篇则是将Library cache从内存中dump出来,看看其结构. 基本命令 ALTER SESSION SET EVENTS 'imme ...
- mysql(1)—— 详解一条sql语句的执行过程
SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...
- 【转载】详解一条sql语句的执行过程
转载自 https://www.cnblogs.com/cdf-opensource-007/p/6502556.html SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言 ...
- 详解一条sql语句的执行过程
SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...
- Linux内存管理之mmap详解
转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用 ...
- 黑马-----内存模型和volatile详解
黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA线程-内存模型和volatile详解 一.单核内存模型 1.程序运行时,将临时数据存放到Cache中 2.将CPU计算所 ...
随机推荐
- php 使用pathinfo(), parse_url(), basename()解析URL
本文章向大家介绍解析URL的三种方法,分别为pathinfo()方法.parse_url()方法和basename()方法.每个方法都列举了一个实例,通过实例更容易理解这三个函数的使用方法和技巧,需要 ...
- nginx 配置文件参数说明
#运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log ...
- Swift学习(二)
一.方法 在OC中,函数是C语言的形式,跟方法不一样 函数:int sum (int num1, int num2) { return num1 + num2; } 方法:- (int)sum:( ...
- 在使用 AjaxFileUpload 上传文件时,在项目发布到 iis 后,图片不能预览
在使用 AjaxFileUpload 上传文件时,图片已经上传成功了,在站点没有发布时,可以预览,可是在项目发布到 iis 后,图片就不能预览,在网上找了很多的方案也没解决,最后的解决方案如下: 1 ...
- Hive On Spark和SparkSQL
SparkSQL和Hive On Spark都是在Spark上实现SQL的解决方案.Spark早先有Shark项目用来实现SQL层,不过后来推翻重做了,就变成了SparkSQL.这是Spark官方Da ...
- 非常不错的IT进阶站点
1:CSDN http://www.csdn.net/ 2:Iteye http://www.iteye.com 3:拼吾爱 http://pin5i.com 4:月光博客 http://www.wi ...
- [设计模式 3] 用设计模式的眼光看MVC框架
导读:之前一直在区分MVC和设计模式的区别,但是,既然有些人认为MVC是一种设计模式,那么它们之间肯定是有共通之处的.所以,本篇博客,就用设计模式的眼光来看MVC框架.仅是本人对于MVC的粗鄙看法,还 ...
- 分区的4k对齐
4k对齐的原理 4k对齐的磁盘性能比非对齐的大致提升在5%-10%左右. fdisk -H 224 -S 56 /dev/sdx #创建分区 fdisk -lu /dev/sdx #验证对齐
- hbase blocksize设置,与hdfs关系
关于如何设定数据块的大小,我们应用一段HFile源码中的注释: 我们推荐将数据块的大小设置为8KB至1MB.大的数据块比较适合顺序的查询(比如Scan),但不适合随机查询,想想看,每一次随机查询可能都 ...
- 为何要使用Linux
摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作. GNU/Linux 不是每个 ...