admin管理员组文章数量:1567279
2024年7月12日发(作者:)
SHARED POOL
SHARED POOL 的内存结构:
1. shared pool从物理结构上来看,是由许多内存块组成。这些内存块称之为chunk。
2. Chunk是shared pool中内存的最小单位。
3. Chunk中所有的内存都是连续的。
CHUNK的可属性:
1. 当chunk属于可用类型的时候,它既不属于library cache,也不属于dictionary cache.
2. 这些chunk可以分为四类:
free(可以不受限制地被分配)。
recr(需要时被移走或者重建,共享sql语句的chunk的类型就是recr)
freeabl(曾经被session使用过,随后会被完全或部分释放。这样的chunk不能临时被移
走)
perm(这样的chunk包含永久的对象,这样的chunk中的可用空间在需要的时候可以
被移走)。
CHUNK链表:
1. 在shared pool中可用的chunk会串起来成为可用链(free list),也称之为bucket.
2. 可用的bucket,被分为254个。
3. 当一个进程需要shared pool里的一个chunk时,该进程首先会在符合所需空间的bucket
上扫描,找到一个合适的chunk。
如果找的chunk尺寸比需要的尺寸要大,该chunk就会被拆分成2个chunk,一个
chunk用来存放数据,一个则成为free类型的chunk并被挂在当前的该bucket。
如果当前bucket上没有符合chunk,就会从下一个非空bucket里找,所里的bucket
都不符合,就会扫描已经使用的recreatable类型的chunk的链表。从该链表上释放一部
分的chunk.
4. 当shared pool找不到足够大小的所需内存的时候,就会发出
ora-4031
的错误信息。
当我们查询v$sgastat里的可用空间时,可能发现name 为free memory可用空间还足
够大,但是还是报错,是因为在发出ora-4031错误的时候,已经释放不少内存。但是在
这些内存当中的chunk,没有一个chunk可以提供连续的的物理内存满足所需要的空间。
5. Shared pool latch的作用:
对bucket的扫描、管理、分配chunk等操作都是在shared pool latch 的保护进行。
如果shared pool含有数量巨大的非常小的free类型的chunk,则在扫描bucket的时候,
shared pool latch会被锁定很长时间。这是ORACLE 8i以前shared pool latch争夺的
主要原因。加大shared pool 只能延缓,以后会越来越严重。Oracle 9i以后,减少chunk
的尺寸递增的幅度,加大了可用chunk链表的数量。效率大大提高了。
6. latch的作用:
所谓latch,就是轻量级的锁。每个进程往内存块写入的数据之前,必须获得一个latch,
写完后释放latch.
7. Shared pool 组件之间的关系:
当某条SQL语句进入library cache的时候,会在library cache找相关的数据字典信息。
(eg:表名、表的列)。如果没有,会将system表空间里的数据字典内容按照行的形式放
入dictionary cache里,从了构造出dc_table之类的对象。再从dictionary cache的行数
据取出相关的信息放入librarary cache.
8. Shared_pool_reserved_size的作用:
1. Shared_pool_reserved_size是为非常大的对象单独保留一块区域空间。而不是从这
个可用的chunk链表中来分配空间的。这个块保留区域与正常chunk管理完全分开。
2. 一般Shared_pool_reserved_size的大小为shared pool 的5%。
3. Shared_pool_reserved_size的这快区域的可用chunk不会挂在bucket上。这块保留
区域的使用情况从视图V$shared_pool_reserved中看出。该视图中的request _misses
字段显示出无法从保留区域里获得足够大的chunk的总次数。该字段应该尽量为0。
Library cache概述:
1. Library cache的主要功能就是存放用户提交的sql语句、sql语句相关的解析树、执行计
划、PL/SQL程序块。
2. Library cache存放了很多的数据库对象的信息。包括:表、索引。
3. Library cache 中存放的所有信息单元都叫做对象。这个对象可以分为两类:
一类叫做存储对象,也就是数据库对象。(Eg:表啊,视图啊,索引啊,包啊,函数啊)
另一类叫做过渡对象,也就是在执行sql语句或者PL/SQL程序时候产生的。(在实例关
闭或者内存不足,就会被删除或者交换出去)
游标:
1. 当sql语句或者PLSQL块到shared pool以后,会找library cache中生成一个可执行的对
象。这个对象叫做游标(cursor)。
2. 这oracle的游标不是与标准的sql的游标一样。标准的sql游标是指多返回多条记录的
sql形式。需要定义,打开,关闭。
3. 每个游标都是由library cache中的两个或者多个对象多体现,至少2个对象。一个对象
叫做父游标(parent cursor),一个对象叫做子游标(child cursor)。
Hash算法:
1. oracle内部实现管理的过程的过程中大量用到hash算法。Hash算法为了进行快速的查
找定位所使用的一种技术。
2. hash算法步骤:1.根据要查的数值,对该值运用一定的hash函数后得出值所在的索引
版权声明:本文标题:5-oracle-SHARED Pool 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1720791049a843100.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论