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函数后得出值所在的索引

本文标签: 对象可用内存空间时候