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 ...
随机推荐
- a5调试
1 generating rsa key...[ 4.452000] mmc0: error -110 whilst initialising SD card[ 5.602000] mmc ...
- nginx中,$request_uri和$uri的区别
nginx中,$request_uri和$uri的区别 $request_uri This variable is equal to the *original* request URI as r ...
- RMAN Restore, Recovery
Complete recovery: rman target / nocatalog startup mount; restore database; recover database; alter ...
- WCF系列 Restful WCF
由于项目需要,需要完成移动端与服务端以json格式的数据交互,所以研究了Restful WCF相关内容,以实现ios端,android端与浏览器端能够与后台服务交互. 那么首先我们来了解下什么是Res ...
- C++ 类模板三(类模版中的static关键字)
//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器 ...
- phpQuery对数据信息的采集进一步学习
前提:需要下载:phpQuery/phpQuery.php 链接:http://www.cnblogs.com/wuheng1991/p/5145398.html 1.对于规则的部分 <?php ...
- asp.net正则表达式删除指定的HTML标签的代码
抓取某网页的数据后(比如描述),如果照原样显示的话,可能会因为它里面包含没有闭合的HTML标签而打乱了格式,也可能它里面用了比较让人 费解 的HTML标签,把预订的格式搅乱. 如果全盘删除里面的 HT ...
- 基础-Eclipse 教程
1.Eclipse 是一个开放源代码的.基于 Java 的可扩展开发平台.2.下载地址为: https://www.eclipse.org/downloads/.3.Eclipse 修改字符集 : W ...
- PAXOS: libevent_paxos
PAXOS实现 -- libevent_paxos 该文章是项目的一部分.主要讲PAXOS算法的实现. ...
- python bottle学习(四)request.quest/query_string/params/body等方法介绍
假设url:http://0.0.0.0:18082/api/cluster/group?wzd=111&abc=cc 方法类型:POST,body是{"name":& ...