sga之library cache 内部原理
一、概述
library cache(库缓存)是shared pool中的一块内存区域,它的主要作用是缓存刚刚执行过的sql语句和pl/sql(包括存储过程、包、函数、触发器)所对应的解析计划、解析树等对象,当同样的sql或pl/sql再次被执行时,就可以直接利用在library cache中的那些相关对象,而无需再次从头开始解析,这样提高了这些语句的执行效率。
查看library cache在内存中的位置。

缓存在library cache中的对象我们称之为库缓存对象(library cache object),所有的库缓存对象都是以库缓存对象句柄(library cache object handle)的结构存储在library cache中,oracle通过访问库缓存对象句柄来访问库缓存对象。
库缓存对象句柄是oracle自定义的一种c语言复杂结构,它是以hash table的方式存储在library cache中的,这意味着oracle会通过hash运算来存储和访问对应的库缓存对象句柄。
下图为从hash角度分析库缓存的构成:

由上图可看出,整个library cache可以看作是一组由hash bucket所组成,每一个hash bucket所对应的不同的哈希值。对于单个bucket而言,里面存储的就是哈希值相同的所有库缓存对象句柄,同一个hash bucket中不同的库缓存对象句柄之间会用指针链接起来,即同一个hash bucket中不同的库缓存对象句柄之间实际上组成了一个库缓存对象句柄链表(library cache object handles)。一个library handle管理着一个libirary cache object(lco),handle对实际的lco起到元数据和指针作用,lco保存着实际信息。
当运行select * from employees时,oracle会计算sql文本的哈希值,以此寻找相关的hash bucket,遍历库缓存对象句柄链表,如果能找到则可直接使用解析计划、解析树等信息,若找不到,则需要从头开始解析,生成解析树、解析计划等并存储在library cache object handle中。
library cache object handle结构图:

库缓存对象句柄有name、namespace等属性组成,着重分析name、namespace、heap 0这三个属性。
属性“name”表示库缓存对象句柄所对应的库缓存对象名称。例如如果是sql语句对应的库缓存对象句柄,则属性name就是该sql语句的sql文本;如果是表对应的库缓存对象句柄,则属性name就是该表的表名。
属性“namespace” 表示的是库缓存对象句柄对应的库缓存对象所在的分组名,不同类型的库缓存对象句柄可能属于同一个分组。
属性 “heap 0 pointer”:这里要说明下library cache object handle类似c语言的结构体,library cache object handle中还嵌套了一些子结构,其中heap 0 pointer是指向子结构heap 0的指针
在library cache中,bucket初始化的数量受隐藏参数 _kgl_bucket_count参数控制。

值为9,则理论上应分配2^9*256=131072个bucket.
通过library cache dump可发现,bucket为131072。在library cache dump中,size为Buckest的数量,count为Object Handles的数量。

heap 0 pointer(一说为heap 0 object)就是指向子结构heap 0的指针,heap 0 的结构如下:

heap 0 也是一种复杂的结构,它有很多属性,
tables属性:记录的是与该heap 0所在的库缓存对象有关的库传讯对象句柄地址集合。Tables分为许多细类。
Data blocks属性。
二、dump验证
分别以sys用户和test用户创建一张一摸一样的表。
SQL> show user
USER is "SYS"
SQL> create table t as select * from v$mystat;
Table created.
另起一个连接,用数据库用户test登录
SQL> show user
USER is "TEST"
SQL> create table t as select * from v$mystat;
Table created.
以俩个用户为基础分别执行select * from t where t.STATISTIC#=671;
查询该sql的sql_id和hash_value

执行library cache dump
SQL> alter session set events 'immediate trace name library_cache level 10';
Session altered.
通过sql_id或hash value查询dump, 可在dump中找到关于该sql的内容,如下图

以上图为例分析library cache结构
Bucket: #=114283 Mutex=0x9bdc28e8(0, 20, 0, 6)
LibraryHandle: Address=0x84e5fb00 Hash=cb15be6b LockMode=N PinMode=0 LoadLockMode=0 Status=VALD
--bucket号,Hash=cb15be6b此处采用的是16进制,转换为十进制的值为3407199851,正好与上面v$sqltext中查出来的值一致。
ObjectName: Name=select * from t where t.STATISTIC#=671
--object 的名称 即上面说过的name属性,也就是lco(library cache objects)
FullHashValue=9581b1f4c50e25f2e8500930da5a0101 Namespace=SQL AREA(00) Type=CURSOR(00) Identifier=0 OwnerIdn=0
--上面说过的namespace,尚不太清楚fullhashvalue的含义
ChildTable: size='16'
Child: id='0' Table=0x87b03f60 Reference=0x87b039c8 Handle=0x98efe438
Child: id='1' Table=0x87b03f60 Reference=0x87b03d10 Handle=0x83595530
--俩个child cursor
参考文档:崔华《基于oracle的sql优化》
sga之library cache 内部原理的更多相关文章
- 如何使用event 10049分析定位library cache lock and library cache pin
Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...
- Library cache lock/pin详解
Library cache lock/pin 一.概述 ---本文是网络资料加metalink 等整理得来一个实例中的library cache包括了不同类型对象的描述,如:游标,索引,表,视图,过程 ...
- 笔记:Memory Notification: Library Cache Object loaded into SGA
笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...
- Memory Notification: Library Cache Object loaded into SGA
问题现象: 数据库服务器可以ping通,但SSH连接不了:应用.plsqldeveloper 也都连接不了.事情到了这个地步,只能重启服务器. 服务器环境:oracle10.2.0.1 +rhel5. ...
- [20190319]shared pool latch与library cache latch的简单探究.txt
[20190319]shared pool latch与library cache latch的简单探究.txt --//昨天看Oracle DBA手记3:数据库性能优化与内部原理解析.pdf 电子书 ...
- [转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)
原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=152393 ...
- Oracle内存详解之 Library cache 库缓冲
Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...
- Oracle内存详解之二 Library cache 库缓冲-转载
Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedu ...
- Oracle数据库大量library cache: mutex X及latch: shared pool问题排查一例
业务系统数据库夯住,数据库内大量的library cache: mutex X及latch: shared pool等待,alert日志信息如下 Tue Sep :: WARNING: inbound ...
随机推荐
- linux学习笔记29---命令watch
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...
- 转载:ffmpeg 音视频合成分割
http://blog.csdn.net/jixiuffff/article/details/5709976 当然先安装了 gentoo 下一条命令搞定 emerge ffmpeg 格式转换 (将f ...
- 简单的SpringCloud 熔断Hystrix
pom配置 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...
- 一行python打印乘法表
一行代码打印乘法表 >>> print '\n'.join([' '.join(['%s*%s=%-2s' %(y,x,x*y) for y in range(1,x+1)]) fo ...
- mybatis实现分页
实现分页实质上就是截取查询结果,还是先贴代码,再来分析 下面是mapper.xml里面的配置 <select id="queryRoleByPage" resultMap=& ...
- 重载(Overload)
重载(Overload) 重载(overloading) 是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 最 ...
- python 数据提取之JSON与JsonPATH
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与 ...
- jqgrid的search
2015-04-19 本人近期的博客都是和之前的随笔相关联的. 今天想和大家分享的是jqgrid中的search. 相信大家写代码用到jqgrid的时候都可能会在jqgrid中涉及查询,其实查询和 增 ...
- (转)Unity笔记之编辑器(BeginToggleGroup、BoundsField、ColorField) ...
1. BeginToggleGroup() BeginToggleGroup函数是定义了一个控制范围,可以控制该范围中的GUI是否启用,看下演示代码: [code]csharpcode: using ...
- Linux系统优化之网络IO调优
修改 vi /etc/sysctl.conf后执行命令 sysctl -p立即生效 首先,系统的不同也会导致 /etc/下的 文件的不同,原本powerpc 环境下 在 /etc/init.d/下有个 ...