共计 2879 个字符,预计需要花费 8 分钟才能阅读完成。
本篇文章给大家分享的是有关 sga 中 library cache 的内部原理是什么,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。
一、概述
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
以上就是 sga 中 library cache 的内部原理是什么,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。