1.shared pool的内存块组成

shared pool中主要的内存区域:free、library cache、row cache

为了确保共享池中共享数据的访问性能,共享池的每次内存分配都必须是连续的内存空间,经过一段时间的运行,共享池中会产生一些碎片,这些碎片分布在一些连续分配的空间之间。

2.共享池堆的内部结构

oracle的内存空间分配是采用堆管理(HEAP)的模式。比如SGA HEAP、PGA HEAP、HEAP TABLE等都是堆内存管理。每个堆包含一个堆句柄和一系列的内存扩展,每个扩展又包含一系列连续的chunk。内存申请者通过在堆上申请空间的模式来获得内存。

堆创建包含两个步骤:一是初始化堆的句柄,二是给堆分配空间。

从chunk中分配空间的基本顺序如下:

1)首先搜索freelist上是否存在可以释放的chunk(在该区域查找的时候首先根据需要分配空间的大小,找到相应的bucket,然后搜索整个链表,如果找到了大小相同的chunk,那么就直接分配使用。如果找不到合适的chunk,就会选择一个稍大的chunk,分配一个和所需空间大小一致的chunk,剩下的空间根据大小挂载到相应的bucket链表上)。

2)如果没找到,就查找是否有recreateable的chunk可以释放。释放已经使用的chunk,需要用到LRU链表。LRU链表根据使用的频繁程度,通过一个双向链来串联已经被分配的chunk。如果在LRU链上找到了可以释放的chunk,就通知HEAP MANAGER去释放,如果该chunk是被锁住的,首先要解锁,然后才能释放。HEAP MANAGER在释放内存时,会自动合并碎片。

3)如果此时还没有找到可以释放的chunk,就从父堆里分配空闲的空间。

4)如果父堆无法分配空间,就会报错。

3.free空间

是一个一个的内存块,使用链(chain)将空闲内存块链起来,(每个链上所挂载的内存块大小是不一样的)。如:硬解析一个sql语句,需要根据解析的sql语句和sql语句的执行计划,它所需要占用的实际内存空间,从相应的链上找空间存放。硬解析需要内存空间,根据实际大小的free内存空间中的链中找到相应大小内存块使用,会产生小内存块(内存碎片)。系统如果有大量硬解析的话。虽然free里面还有很多空间,但是所有的空间都是小的。并不能使用。

SQL> select * from v$sgastat where pool='shared pool' and name='free memory';

4.library cache空间

library cache里面有很多链,链下挂有很多chunk,但是chunk里面都写了内容(sql,sql执行计划)。

根据什么把不同的chunk写上内存后挂在不同链上:

把sql语句所有的字母转换成ASCII码值,就成了数字,对这些数字经过几次运算,就是链的编号,这个sql语句就挂到所对应的编号上。当再次执行sql语句的时候,就会从对应编号的链上去找对应的chunk。

SQL>select * from v$sgastat where name='library cache';

5.数据字典缓存(row cache)

数据字典缓存不是纯粹的数据字典表的缓存,数据字典缓存是经过组织的,用于数据库运行中sql解析、权限控制等用途的内部数据结构,是一种字典表的内存视图。如:在执行某个sql的时候,为了sql解析,需要访问一些字典表,从中获取一些数据,那么它会通过一些递归调用sql来完成这些事情。首先需要将数据块从系统表空间中读取到DB cache,然后从DB cache中获得sql所需要的行数据。为了减少递归sql的执行开销,这些行数据被缓存在共享池中,这个缓存就是数据字典缓存。

SQL> select * from v$sgastat where name='row cache';

6.执行一条之前为缓存的sql语句,查看链表中chunk数量的变化

SQL> select count(*) from x$ksmsp;

COUNT(*)

----------

36635

SQL> select count(*) from dba_indexes;         --第一次执行发生硬解析,链上的chunk数量将有所增加

COUNT(*)

----------

2344

SQL> select count(*) from x$ksmsp;

COUNT(*)

----------

36650

SQL> alter system flush shared_pool;          --将shared pool清空,之后第一次执行的所有DML语句都将是硬解析

7.shared pool中的保留池设置

如果共享池中碎片化变得十分严重,就会导致比较大的共享内存分配无法满足需求,oracle在共享池中设计了保留池.

保留池的设计目的是为了在共享池碎片化很严重的时候,还能够有一部分保留空间,用于较大的内存分配。可以通过参数shared_pool_reserved_size来设置保留池的大小(由于oracle的内存自动管理机制,一般情况下不需要手动设置)。

SQL> show parameter shared_pool_reserved_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

shared_pool_reserved_size            big integer 6081740

保留池的使用条件:

1)必须是在共享池的freelist中找不到足够大的chunk

2)分配的内存容量要大于shared_pool_reserved_min_alloc的设定值(从8i开始该参数变为隐含参数,即_shared_pool_reserved_min_alloc,默认值为4400B),只有大于该设定值的内存分配才被认为是大内存分配。

oracle 保留池,ORACLE SGA之shared pool相关推荐

  1. Oracle 如何设置shared pool 和sga大细, 应该设置几大

    这篇文章是参考甲骨论老相老师的教学视频: http://v.youku.com/v_show/id_XMzkyMTg4Njg0.html 所做的学习笔记 前面已经提过shared pool(共享池)的 ...

  2. oracle11 share pool,Oracle Shared pool 详解

    . Shared Pool概述 在之前的blog对的内存也做了一个概述,参考: Oracle内存架构详解 在网上搜到一篇介绍shared pool非常详细的pdf资料. 原文链接以找不到,但还是要感谢 ...

  3. SHARED POOL 原理

    SHARED POOL 原理 由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构,library cache latch,library ...

  4. 隐含参数与 Library Cache 与 Shared Pool Latch 原理

    现在每一个 Oracle DBA,很少有不知道隐含参数的.但至少在表面上,Oracle 是不支持将隐含参数用于数据库的.隐含参数通常用于救急,或者是作为 Oracle BUG 的临时解决方案(Work ...

  5. oracle 内存分配,Oracle实例中的内存分配管理

    SGA(System Global Area)管理 SGA是一段共享内存区域,包含实例的数据和控制信息,多个用户可以通过这个内存区域共享数据,以避免反复.长时间的从物理磁盘访问数据. SGA的组成:D ...

  6. oracle shared pool size,oracle 关于设置shared pool及sga大小

    本文参考了https://blog.csdn.net/xinzhan0/article/details/52461611?locationNum=2&fps=1 如何设置shared pool ...

  7. oracle shared pool size,SHARED_POOL_RESERVED_SIZE参数的设置及作用

    SHARED_POOL_RESERVED_SIZE参数的设置及作用 shared_pool_reserved_size: 该参数指定了保留的共享池空间,用于满足将来的大的连续的共享池空间请求.当共享池 ...

  8. oracle小型机价格内存,案例:IBM aix小型机内存使用太多导致Oracle shared pool 相关lat...

    天萃荷净 IBM aix小型机内存使用太多导致Oracle数据库shared pool 相关latch异常 某客户有一服务器,shared pool 相关latch出现异常等待,影响系统性能. 分析结 ...

  9. mysql连接池永驻_【学习笔记】Oracle连接池 数据库常驻连接池(Database Resident Connection Pool)案例介绍...

    天萃荷净 分享一篇关于应用程序与Oracle数据库连接的连接方法介绍,数据库常驻连接池(Database Resident Connection Pool)案例介绍 一.介绍常驻连接池(Databas ...

最新文章

  1. http://www.jikexueyuan.com/course/181.html
  2. 工资表 车辆工程 冯大昕
  3. 同事操作两个数据源保持事务一致_微服务分布式事务4种解决方案实战
  4. http请求中get和post方法的区别
  5. python 格式化字符串 模板字符串(五分钟读懂)
  6. ubuntu13.04中把ibus中的中文拼音输入设为默认
  7. 【原】Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法...
  8. 推荐:绝对是最好用的公式编辑器
  9. 2022 最新 R 语言 与 RStudio 安装配置教程
  10. 固态硬盘能不能提高计算机速度,固态硬盘掉速如何解决?用这几招轻松提升PC速度...
  11. Proxyee Down百度网盘高速下载器详细使用教程
  12. POJ 3295: Tautology
  13. 关于Jetson TX2刷机各种问题(刷机后键盘等等奇葩错误)
  14. 基于低代码开发平台实现集团战略督办管理系统
  15. thirteen——sed
  16. el-table 动态多级表头以及数据
  17. 网站上线要做的事和不该做的事,你知道吗?
  18. 非洲又穷又落后?那里可能长出100个阿里巴巴
  19. 佟大为新任《非诚》嘉宾 极力反对异地恋
  20. C++常见编译WARNING小结

热门文章

  1. H5画布 canvas(三)canvas 库 Konva.js 的使用
  2. 用Python保住“设计大哥“的头发,直接甩给他10000张参考图,爬虫采集【稿定设计】平面模板素材
  3. 显卡测试软件毛毛虫,绘本大师艾瑞·卡尔去世,他带着独一无二的色彩去到了天堂...
  4. 3 判断单链表的对称性
  5. 显存优化:纹理压缩功能介绍与使用说明
  6. 我的e家(IPTV)
  7. 万花筒理论 (转载)
  8. itmo大学计算机专业,ITMO University
  9. 破云里步重华为什么说自己姓薛_破云主角也有弱点,小鱼栽在零食上,严峫被自己坑,步重华太好笑...
  10. vue中将名字,除了姓其余都用*标识