一、概述

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 内部原理的更多相关文章

  1. 如何使用event 10049分析定位library cache lock and library cache pin

    Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...

  2. Library cache lock/pin详解

    Library cache lock/pin 一.概述 ---本文是网络资料加metalink 等整理得来一个实例中的library cache包括了不同类型对象的描述,如:游标,索引,表,视图,过程 ...

  3. 笔记:Memory Notification: Library Cache Object loaded into SGA

    笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...

  4. Memory Notification: Library Cache Object loaded into SGA

    问题现象: 数据库服务器可以ping通,但SSH连接不了:应用.plsqldeveloper 也都连接不了.事情到了这个地步,只能重启服务器. 服务器环境:oracle10.2.0.1 +rhel5. ...

  5. [20190319]shared pool latch与library cache latch的简单探究.txt

    [20190319]shared pool latch与library cache latch的简单探究.txt --//昨天看Oracle DBA手记3:数据库性能优化与内部原理解析.pdf 电子书 ...

  6. [转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)

    原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=152393 ...

  7. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  8. Oracle内存详解之二 Library cache 库缓冲-转载

    Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedu ...

  9. Oracle数据库大量library cache: mutex X及latch: shared pool问题排查一例

    业务系统数据库夯住,数据库内大量的library cache: mutex X及latch: shared pool等待,alert日志信息如下 Tue Sep :: WARNING: inbound ...

随机推荐

  1. 构建自己的embedded linux系统

    [教程]使用buildroot完全自定义自己的embedded linux系统(nand)http://www.eeboard.com/bbs/thread-38377-1-1.html [教程] [ ...

  2. 两款 REST 测试工具

    用CURL命令行测试REST API 无疑是低效率的,这里把最近使用的两款 Chrome 插件总结下 POSTMAN 简单易用 REST Console 功能强大 使用的话用POSTMAN就够用了,但 ...

  3. UVA1349 Optimal Bus Route Design 拆点法+最小费用最佳匹配

    /** 题目:UVA1349 Optimal Bus Route Design 链接:https://vjudge.net/problem/UVA-1349 题意:lrj入门经典P375 给n个点(n ...

  4. 解决微信小程序中Date.parse()获取时间戳IOS不兼容的问题(IOS为NaN的问题)

    前端同事在做微信小程序时发现IOS获取的时间戳为空的问题,后来通过跟踪发现,原来是因为IOS系统不支持2017-01-01格式的时间导致的, var mydata = '2017-01-01 11:0 ...

  5. redis命令使用

    set key value get key 删除key (返回被移除key的数量.):del key 检查给定key是否存在(若key存在,返回1,否则返回0.):exists key > ex ...

  6. 虚拟机Ubuntu系统下kaldi安装与编译简介

    kaldi官网:http://www.kaldi-asr.org/doc/index.html 在http://github.com/kaldi-asr/kaldi中直接下载kaldi的zip包,没有 ...

  7. vi 的使用,很详细

    来源:鸟哥的Linux私房菜 网址:http://vbird.dic.ksu.edu.tw/linux_basic/0310vi_2.php

  8. db2 设置表 not null

    db2将原表列notnull属性修改为null属性的方法   今天把自己遇到的一个小问题跟大家分享一下如何修改db2数据库表中列的属性--将列的非空属性改为允许空的属性,修改数据表的某一列属性其实很简 ...

  9. C#基础语言知识--编译和执行过程

    http://blog.csdn.net/stive_sourcexin/article/details/51329697

  10. IOS . -转载-10行代码搞定九宫格

    //每个Item宽高 CGFloat W = ; CGFloat H = ; //每行列数 NSInteger rank = ; //每列间距 CGFloat rankMargin = (self.v ...