O-理解共享池

我们可以通过show sga命令查看共享池的整体组成部分:

....待截图....

一、SGA内存结构

Oracle中SGA主要包括:

  1、固定数据结构部分(FIXED Size) 2、数据块缓冲区(DATABASE BUFFER) 3、REDO LOG缓冲区(redo
buffers) 4、共享池(在variable size中)。

固定区域包含了所有其他共享内存结构和重要的数据结构的地址和指针、资源、锁等,可通过如下命令详细列出具体内容:

  select pool,name,bytes from v$segstat where pool = ‘shared pool‘;

  顾名思义,共享池是为了让大家共享数据而设置的缓冲池,而且共享池也是很多会话为自己执行SQL分配共享内存的缓冲池,这些在共享池中分配的内存在会话之间使用十分频繁,应实现一次分配多次使用,并且能被实例中其他会话共享。

二、SGA内存分配  

  DB CACHE可以根据数据块大小很规则的均匀分配,因此不会出现碎片问题,而且DB CACHE分配与归还相对简单。但与DB
CACHE不同,由于各个会话在共享池中分配空间的时候所需要的空间差异很大,有时几十字节,有时几百字节甚至几兆,因此共享池的分配归还十分复杂。为了确保共享池中共享数据的访问性能,共享池的每次内存分配都必须是连续的内存空间,由于这个特点,经过一段时间后,共享池中或多或少都会出现一些碎片,这些碎片分布在一些连续分配的空间之间。

  共享池中分配的内存空间有些事永久使用,不释放的并标记为PERMANENT,这些结构大多是在实例启动时分配的,也有些是系统运行过程中分配的,但这些内存的特点是只分配,在实例关闭前不会释放,例如:进程信息数据,会话数据,特殊内容的进程段。进程和会话信息是通过PROCESSES和session参数分配的,实例启动时一次性分配,分配后不变动,也不会动态扩展,因此加大processes参数必须要重启实例,另外有些特殊用途的内存数组也是在实例启动时分配,是动态扩展的,只分配不释放,在后续可动态扩展,例如:enqueues(locks),enqueue
resource,transactions,transaction branches等,对于RAC还有gcs resource,ges
resource等。如果这些动态扩展动作经常发生,将会在共享池的连续空间中产生大量的不可释放的小碎片,从而导致共享池碎片化。(典型案例:9i中经常由于ges
resource扩展导致共享碎片问题,并产生4031错误。10.2版对此进行了改进,详细理解请百度)

  共享池中还有些是分配后可释放的,这些内存被标记为freeable或者recreateable。freeable是可以直接释放,recreateable的内存在unpin后也是可以释放的,因此他们都是可以重用的内存。

二、共享池管理

  共享池内存是通过ORACLE通用内存管理(generic oracle memory manager)来进行管理的,这个就是我们总说的KGH heap
manager。在KGH机制下,所有共享池的FREE内存都被挂在称为freelists的空闲链表上,这个空闲链表是按照bucket机制建立的,根据空闲内存片段大小,挂在不同的Bucket上,例如:9i的共享池的freelists包含256个bucket,每个bucket上连接了不同大小的空闲内存块

  *小于812B的Bucket是以4B为步长增长的,如16B,20B,24B.....812B;

  *超过812B的bucket是以64B为步长增长的,如876B,940B,....4012B;

  *超过4012B的bucket是以4096的倍数倍增的,如4108,8042,16396,32784,.....

当某个会话需要从共享池中分配空间的时候,会根据自己分配的大小找到某个bucket,然后找到一个空闲的内存,从中产生的剩余内存,会被挂到相应的bucket上,供其他会话分配使用,而被释放的内存会被挂到freelists上,为了不碎片化,被释放的内存自动合并,如果两个内存片段相邻,ORACLE会将他们合并为一起。

  共享池大小通过shared_pool_size参数定义,自动内存管理模式不用设置此参数,如果设置了此参数那么共享池会根据这个参数作为初始大小和最小值,无论内存如何调整,共享池大小都不能小于这个参数。

三、共享池内部结构(堆)
/*此处很难待续...关注<DBA思想的天空>64页*/

  ORACLE内存空间分配时采用堆管理(HEAP)的模式,堆管理的基础是KGH。ORACLE常见的内存堆包括SGA HEAP,PGA
HEAP,另外大部分表也是堆表(HEAP TABLE),其空间管理的基本概念都是使用KGH。

四、共享池转储文件简单说明

  转储文件有几百兆深圳几个G,共享池的内容转储到文件的基本命令,用如下命令可以把LIBRARY_CACHE的内容转储到TRACE文件中:

ALTER SESSION SET EVENTS ‘immediate trace name LIBRARY_CACHE level
<level>‘;

其中level代表级别,9.2版本后不同level含义如下

* level=1 转储库缓存统计信息

* level=2 转储散列表概要

* level=4 转储库缓存对象,只包含基本信息

* level=8 转储库缓存对象,包含详细信息(包括child reference,pin waiters等)

* level=16 增加堆大小信息

* level=32 增加堆信息

O-理解共享池,布布扣,bubuko.com

时间: 2024-08-05 20:58:40

O-理解共享池的相关文章

共享池之SQL

--共享池中保留区的信息查询 select * from v$shared_pool_reserved --查询hard parse比率 select a.value as Total,b.value as "Hard Pase", round(b.value/a.value,2) as Ratio from v$sysstat a,v$sysstat b where a.name='parse count(total)' and b.name='parse count(hard)';

将指定SQL的执行计划从共享池删除的方法

如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现. 对于以前的版本而言,最显而易见的方法莫过于直接刷新共享池,但是如果是数据库中绝大部分的SQL都存在问题,那么这种方法无可厚非,也可能是见效最快的方法,而如果数据库中仅仅是个别的SQL存在问题,那么这种方法就过于暴力了. SQL> select count(*) from dual; COUNT(*) ---

Oracle OCP之硬解析在共享池中获取内存锁的过程

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38684819 1.获得library cache Latch (1)在父游标的名柄没有找到SQL语句的文本:select * from gyj_t1 where id=1; 2.释放library cache Latch 3.获得shared pool Latch     (1)搜索FreeList 空闲Chunk     (2)搜索LRU上可覆盖的chunk     (3)搜索R-Fr

ORACLE从共享池删除指定SQL的执行计划

Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划,这样在特殊情况下,就避免你要将整个SHARED POOL清空的危险情况.例如某个SQL语句由于优化器产生了错误的执行计划,我们希望优化器重新解析,生成新的执行计划,必须先将SQL的执行计划从共享池中刷出或将其置为无效,那么优化器才能将后续SQL进行硬解析.生成新的执行计划.这在以前只能使用清空共享

体系结构中共享池研究

1.keep 让SQL跑得更快. 有时候一些基础表需要非常的频繁访问,尤其是在一些循环中,对该表中的访问速度将变的非常重要.为了提高系统的处理性能,可以考虑将一些表及索引读取并保存到内存中. 二.关于keep内存的几个参数 下面了解一下具体和CACHE有关的几个概念,即DB_CACHE中的几个pool: DB_CACHE_SIZE:指定缺省的buffer pool的大小,以字节为单位. DB_KEEP_CACHE_SIZE:指定keep buffer pool的大小,以字节为单位. DB_REC

ORACLE将执行过的SQL语句存放在内存的共享池

Oracle SQL性能优化深入浅出 ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享.当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用. 为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglob

Oracle 共享池和数据库高速缓冲区,引出SQL执行过程

共享池在数据库中可以说是相当重要动力资源,关系着数据库的性能瓶颈. 什么是共享池呢? 共享池是内存结构中SGA(系统全局区)的一部分,包含了:库缓冲区.数据字典缓冲区.服务器结果缓冲区.预留池,也是着四个区组成了共享池,这四个区的功能就是共享池的功能. 库缓冲区 共享SQL区:存放执行计划和解析树,当用户执行一条SQL语句时,共享池会根据SQL语句的复杂程度分出一定的内存给用户,当用户再次执行相同的SQL语句时,不必再次进行解析,提高执行语句的执行效率.类似于古代将领带兵打仗,皇帝就是用户,把将

java中字符串池,String池,共享池到底是怎么回事?

栈中有共享池的概念,(视频下载) (全部书籍)比如下面例子中,sz="hello";在栈中创建一个String对象引用变量sz,然后看看栈中有没有"hello",如果没有,则将"hello"存放进栈,并令sz指向"hello",如果已经有"hello" 则直接令sz指向"hello".对于int, float 类型的变量也是一样的有这种共享池的概念, 对于下面程序中:ss0 = new

Java核心(二)深入理解线程池ThreadPool

本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据自己的情况自主选择阅读顺序和需要了解的章节. 一.线程池优点 线程池能够更加充分的利用CPU.内存.网络.IO等系统资源,线程池的主要作用如下: 利用线程池可以复用线程,控制最大并发数: 实现任务缓存策略和拒绝机制: 实现延迟执行 阿里巴巴Java开发手册强制规定:线程资源必须通过线程池提供,如下图