共享内存shared pool (3):Library cache
Shared pool物理层面上由许多内存块(chunck)组成。从逻辑功能划分,Shared pool主要由三部分组成:Library cache,Dictionary cache和Control Structure。本文主要讲述 Library cache.
Library cache
library cache最主要的功能就是存放用户提交的SQL语句,SQL语句相关的解析树(解析树也就是对SQL语句中所涉及到的所有对象的展现)--->共享SQL区(shared SQL areas),私有SQL区(private SQLareas,如果配置了共享服务器),执行计划,用户提交的PL/SQL程序块(包括匿名程序块,存储过程,包,函数等)以及它们转换后能够被Oracle执行的代码等,为了对这些内存结构进行管理,library cache中还存放了很多控制结构,包括lock,pin,dependency table,11G中的mutex等
Library cache要解决三个问题
- 快速定位:Library cache中对象众多,Oracle如何管理这些对象,以便服务进程可以迅速找到他们需要的信息。比如,某个服务进程需要迅速定位某个SQL是否存在于Library cache中。
- 关系依赖:Library cache中的对象存在复杂的依赖关系,当某个objec失效时,可以迅速将依赖其的对象也置为失效状态。比如,某个表发生了结构变化,依赖其的SQL语句需要重新解析。
- 并发控制:Library cache中必须有一个并发控制的机构,比如:锁机制,来管理大量共享对象的并发访问和修改的问题
Library cache问题的解决方法
- 快速定位:Oracle利用Hash Bucket结构来解决library cache中快速定位的问题
- 关系依赖:Oracle利用LCO(library cache object)中dependency table解决对象依赖关系
- 并发控制:Oracle利用LATCH/LOCK/PIN解决并发控制
Hash Bucket
- Hash Bucket是通过串连起来的对象句柄体现出来的,Hash Bucket本身是一个逻辑的概念,而不像对象是一个具体的实体。
- Oracle根据shared_pool_size尺寸自动计算hash buckets的个数,shared pool越大,则可以挂载的对象句柄就越多。
- 此处的Hash Bucket同 共享内存 share pool (2)中的Bucket原理相似,但不是同一个。
library cache handle
每个hash bucket后面都串连着多个句柄,这些句柄描述了library cache里的对象的一些属性,包括名称、标记、指向对象所处的内存地址的指针等
library cache object
Library Cache Object是由一些独立的heap所组成。前面说Library cache handle指向对象(Library cache Object),其实就是指向第一个heap 0,而Heap 0记录了指向其他heap的指针信息
- Dependency table --当前LCO依赖的其它LCO信息,如SQL语句依赖的表、视图等. (LCO :library cache object)
- Chile table----保存当前LCO的子LCO信息。
- Data blocks ---保存SQL语句、执行计划、执行文本等信息
SQL语句在Library cache执行的第一次检查过程
- 通过语法语义权限等检查的SQL语句进入Library cache
- 将SQL文本转化为ASCII值(大小写ASCII不同)并进行hash函数的运算
- 得到一个HASH值对应到hash bucket的号码
- 进入该hash bucket对应的链表进行扫描并比较
parent cursor/ child cursors
当用户提交SQL语句或PL/SQL程序块到oracle的shared pool以后,在library cache中生成的一个可执行的对象,这个对象就叫做游标(cursor)。不要把这里的游标与标准SQL(ANSI SQL)的游标混淆起来了,标准SQL的游标是指返回多条记录的SQL形式,需要定义、打开、关闭。下面所说到的游标如无特别说明,都是指library cache中的可执行的对象。游标是可以被所有进程共享的,也就是说如果100个进程都执行相同的SQL语句,那么这100个进程都可以同时使用该SQL语句所产生的游标,从而节省了内存。
每个游标都是由library cache中的两个或多个对象所体现的,至少两个对象。一个对象叫做父游标(parent cursor),包含游标的名称以及其他独立于提交用户的信息(v$sqlarea视图里看到的都是有关父游标的信息);另外一个或多个对象叫做子游标(child cursors)。例如:SQL文本相同,但提交SQL语句的用户不同,有可能生成不同的子游标。
参考blog:
http://blog.csdn.net/haibusuanyun/article/details/17844211
http://czmmiao.iteye.com/blog/1273261
共享内存shared pool (3):Library cache相关推荐
- ORA-04031: 无法分配 3840 字节的共享内存 (“shared pool“,“unknown object“,“sga heap(1,0)“,“kglsim object batch“)
sql>alter system set shared_pool_reserved_size='比原先值适当增加' scope=spfile; sql>shutdown immediate ...
- 共享池 shared pool
定义: 共享池( shared pool )是位于SGA中的一块内存区域,主要用于缓存SQL的执行计划.之所以叫共享,是由于该块内存区域可以被多个会话共享同一个执行计划.即,如果有一个会话执行了SQL ...
- linux shared,从 0 开始学习 Linux 系列之「22.共享内存 Shared Memory」
共享内存 版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! 共享内存 Shared Memory 这次我们来学习在 Linux 中最快的一种 IPC 方式:共 ...
- 进程间通信之-共享内存Shared Memory--linux内核剖析(十一)
共享内存 共享内存是进程间通信中最简单的方式之中的一个. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存同意两个或很多其他进程訪问同一块内存,就如同 malloc() 函数 ...
- Linux——详解共享内存shared memory
目录 一.共享内存介绍 (一).什么是共享内存 (二).共享内存优点 (三).共享内存缺点 二.共享内存使用 (一).创建-shmget ①key ②size ③shmflg ④返回值 (二).连接- ...
- 隐含参数与 Library Cache 与 Shared Pool Latch 原理
现在每一个 Oracle DBA,很少有不知道隐含参数的.但至少在表面上,Oracle 是不支持将隐含参数用于数据库的.隐含参数通常用于救急,或者是作为 Oracle BUG 的临时解决方案(Work ...
- oracle11 share pool,Oracle Shared pool 详解
. Shared Pool概述 在之前的blog对的内存也做了一个概述,参考: Oracle内存架构详解 在网上搜到一篇介绍shared pool非常详细的pdf资料. 原文链接以找不到,但还是要感谢 ...
- GPU 共享内存bank冲突(shared memory bank conflicts)
GPU 共享内存bank冲突(shared memory bank conflicts) 时间 2016-11-05 21:47:58 FindSpace 原文 http://www.findspac ...
- SHARED POOL 原理
SHARED POOL 原理 由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构,library cache latch,library ...
- atch: shared pool 优化探索
首先来看赤裸裸的问题直击: Top 10 Foreground Events by Total Wait Time Event Waits Total Wait Time (sec) Wait Avg ...
最新文章
- 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析
- 3.2 封装成帧和透明传输
- libpcap-mmap分析(五)
- 用webpack构建一个常规项目,好处和坏处分析
- python ip代理池_python实现ip代理池功能示例
- 值得推荐的C/C++框架和库(转载)
- switch omega - VNP
- 拿 C# 搞函数式编程
- java lambda 实现_Java 8 Lambda实现原理分析
- 大院大所合作对接会7天倒计时!亮点抢先看
- c语言饿结构_C语言的四种程序结构
- c如何接收java指令_java指令和javac指令总结
- Java线程池 - 问题驱动学习
- Java 使用 Redis | 菜鸟教程
- ElementUI 面试题整理
- Win10下运行红色警戒2
- 2021年中国研究生数学建模竞赛A题(华为公司命题)——相关矩阵组的低复杂度计算和存储建模
- 【高德地图API】从零开始学高德JS API(一)地图展现——仙剑地图,麻点图,街景,室内图
- 44学习自动化运维工具 Chef 的基本用法,包括厨师编写、节点管理
- 最后1天,包邮送50豆瓣高分Python 好书
热门文章
- pix2pixhd_图像翻译三部曲:pix2pix, pix2pixHD, vid2vid
- 【机器学习系列】隐马尔科夫模型第二讲:前向算法、后向算法
- 【Gym 102134-E】Kth subtree【权值树状数组、二分统计第k大+dfs离线操作】
- gamma 函数的 LaTeX 代码
- Linux进程优先级取值范围,Linux中使用nice和renice命令:改变进程优先级
- think php5关联模型,thinkphp5 关联模型
- 卡爆mysql_荐 MySQL死锁和卡死分析
- php对字符串简单加密解密,PHP字符串加密解密
- 软件测试黑盒测试实验心得_视频资源25套高级软件测试,性能测试,功能测试下载自动化测试...
- linux模拟http请求命令