SGA&PGA&UGA

  1. SGA的设置
    Fixed Size
    oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA 各部分组件的信息,可以看作引导建立SGA的区域。
    Variable Size
    包含了shared_pool_size、java_pool_size、large_pool_size 等内存设置
    Database Buffers

    数据缓冲区,在8i
    中包含db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle
    三部分内存。在9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、
    db_nk_cache_size。
    Redo Buffers
    指日志缓冲区,log_buffer。在这里要额外说明一点的是,对
    于vparameter、vparameter、vparameter、vsgastat、vsga查询值可能不一样。vsga查询值可能不一样。vsga查询值可能不一样。v parameter
    里面的值,是指用户在初始化参数文件里面设置的值,vsgastat是oracle实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block为最小单位进行分配的),vsgastat是oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block 为最小单位进行分配的),vsgastat是oracle实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block为最小单位进行分配的),vsga
    里面查询的值,是在oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小是8k(不同环境可能不一样)。

1.2 SGA的大小设置
1.2.1 设置参数前的准备
在设置SGA的内存参数之前,我们首先要问自己几个问题
一:物理内存多大
二:操作系统估计需要使用多少内存
三:数据库是使用文件系统还是裸设备
四:有多少并发连接
五:应用是OLTP 类型还是OLAP 类型

于文件系统和裸设备的问题,这往往容易被我们所忽略。操作系统对于文件系统,使用了大量的buffer
来缓存操作系统块。这样当数据库获取数据块的时候,虽然SGA
中没有命中,但却实际上可能是从操作系统的文件缓存中获取的。而假如数据库和操作系统支持异步IO,则实际上当数据库写进程DBWR写磁盘时,操作系统在
文件缓存中标记该块为延迟写,等到真正地写入磁盘之后,操作系统才通知DBWR写磁盘完成。对于这部分文件缓存,所需要的内存可能比较大,作为保守的估
计,我们应该考虑在 0.2——0.3 倍内存大小。但是如果我们使用的是裸设备,则不考虑这部分缓存的问题。这样的情况下SGA就有调大的机会。

于数据库有多少并发连接,这实际上关系到PGA 的大小(MTS 下还有large_pool_size)。事实上这个问题应该说还跟OLTP
类型或者OLAP 类型相关。对于OLTP类型oracle 倾向于可使用MTS,对于OLAP 类型使用独立模式,同时OLAP
还可能涉及到大量的排序操作的查询,这些都影响到我们内存的使用。那么所有的问题综合起来,实际上主要反映在UGA的大小上。UGA主要包含以下部分内存
设置
SQL> show parameters area_size
NAME TYPE VALUE


bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
hash_area_size integer 131072
sort_area_size integer 65536

这个基础上,我们假设数据库存在并发执行server process 为100 个,根据上面我们4 个参数在oracle8.1.7
下的默认值,我们来计算独立模式下PGA 的大致大小。由于会话并不会经常使用create_bitmap_area_size
、bitmap_merge_area_size,所以我们通常不对四个参数求和。在考虑到除这四个参数外会话所保存的变量、堆栈等信息,我们估计为
2M,则200 个进程最大可能使用200M 的PGA。
1.2.2 一个经验公式
OS 使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7*总内存

1.2.3 各个参数的设置
那么SGA中的各个参数具体应该按照什么样的原则来设置呢,下面进行讨论:
log_buffer
对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR写的触发条件之后,我们会发现通常超过3M意义不是很大。作为一个正式系统,可能考虑先设置这部分为log_buffer=1—3M 大小,然后针对具体情况再调整。
large_pool_size

于大缓冲池的设置,假如不使用MTS,建议在20—30M 足够了。这部分主要用来保存并行查询时候的一些信息,还有就是RMAN
在备份的时候可能会使用到。如果设置了MTS,则由于UGA部分要移入这里,则需要具体根据session最大数量和 sort_ares_size
等相关会话内存参数的设置来综合考虑这部分大小的设置,一般可以考虑为 session * (sort_area_size +
2M)。这里要提醒一点,不是必须使用MTS,我们都不主张使用MTS,尤其同时在线用户数小于500的情况下。
java_pool_size
假如数据库没有使用JAVA,我们通常认为保留10—20M大小足够了。事实上可以更少,甚至最少只需要32k,但具体跟安装数据库的时候的组件相关(比如http server)。
shared_pool_size

是迄今为止最具有争议的一部分内存设置。按照很多文档的描述,这部分内容应该几乎和数据缓冲区差不多大小。但实际上情况却不是这样的。首先我们要考究一个
问题,那就是这部分内存的作用,它是为了缓存已经被解析过的SQL,而使其能被重用,不再解析。这样做的原因是因为,对于一个新的SQL
(shared_pool
里面不存在已经解析的可用的相同的SQL),数据库将执行硬解析,这是一个很消耗资源的过程。而若已经存在,则进行的仅仅是软分析(在共享池中寻找相同
SQL),这样消耗的资源大大减少。所以我们期望能多共享一些SQL,并且如果该参数设置不够大,经常会出现ora-04031错误,表示为了解析新的
SQL,没有可用的足够大的连续空闲空间,这样自然我们期望该参数能大一些。但是该参数的增大,却也有负面的影响,因为需要维护共享的结构,内存的增大也
会使得SQL 的老化的代价更高,带来大量的管理的开销,所有这些可能会导致CPU 的严重问题。
在一个充分使用绑定变量的比较大的系统
中,shared_pool_size 的开销通常应该维持在300M 以内。除非系统使用了大量的存储过程、函数、包,比如oracle erp
这样的应用,可能会达到500M甚至更高。于是我们假定一个1G内存的系统,可能考虑设置该参数为100M,2G 的系统考虑设置为150M,8G
的系统可以考虑设置为200—300M。
对于一个没有充分使用或者没有使用绑定变量系统,这可能给我们带来一个严重的问题。所谓没有使用bind var 的SQL,我们称为Literal SQL。也就是比如这样的两句SQL我们认为是不同的SQL,需要进行2 次硬解析:
select * from EMP where name = ‘TOM’;
select * from EMP where name = ‘JERRY’;

如把 ’TOM’ 和 ’JERRY’ 换做变量V,那就是使用了bind var,我们可以认为是同样的SQL 从而能很好地共享。共享SQL
本来就是shared_pool_size 这部分内存存在的本意,oracle的目的也在于此,而我们不使用bind var
就是违背了oracle
的初衷,这样将给我们的系统带来严重的问题。当然,如果通过在操作系统监控,没有发现严重的cpu问题,我们如果发现该共享池命中率不高可以适当的增加
shred_pool_size。但是通常我们不主张这部分内存超过800M(特殊情况下可以更大)。
事实上,可能的话我们甚至要想办法避免软分析,这在不同的程序语言中实现方式有差异。我们也可能通过设置session_cached_cursors 参数来获得帮助(这将增大PGA)
关于使用绑定变量的话题,在下面的应用优化中继续讨论。
Data buffer

在我们来谈数据缓冲区,在确定了SGA
的大小并分配完了前面部分的内存后,其余的,都分配给这部分内存。通常,在允许的情况下,我们都尝试使得这部分内存更大。这部分内存的作用主要是缓存
DB BLOCK,减少甚至避免从磁盘上获取数据,在8i中通常是由db_block_buffers*db_block_size
来决定大小的。如果我们设置了buffer_pool_keep 和buffer_pool_recycle,则应该加上后面这两部分内存的大小。
可以看出,设置SGA时基本上应该掌握的原则是:
data buffer 一般可以尽可能的大
shared_pool_size 应该适度
log buffer 在 1MB 以内就可以了
假定oracle是 32 bit ,服务器RAM大于2G ,注意你的PGA的情况,,则建议
shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G

在32bit的数据库下,通常oracle只能使用不超过1.7G的内存。
trace session的方式是一种自下而上的方法,从sql入手;而statspack是自顶向下的方法.

Oracle 9i 中,optimizer_mode 参数有四种取值,决定了四种优化模式: rule, choose, all_rows, 和
first_rows,其中 rule 和 choose 两种模式表示目前已经过时的基于规则的优化器模式(rule-based
optimizer,简称RBO),所以我们在此着重讨论后两种CBO模式。

oracle SGA PGA UGA 内存相关推荐

  1. Oracle SGA PGA UGA

    SGA 系统全局区(System Global Area),几乎所有进程都会访问SGA中某一个点. PGA 进程全局区(Process Global Area),进程或者线程专属内存区,其它进程或线程 ...

  2. oracle+sga+pga用途,Oracle9i 动态SGA,PGA特性探索

    Oracle9i 动态SGA,PGA特性探索 更新时间:2009年03月03日 23:23:54   作者: 虽然Oracle9i中的内存管理仍然需要很多的手工操作,不过大部分的Oracle管理员可以 ...

  3. Oracle内存结构:SGA PGA UGA

    oracle内存结构: SGA.PGA.UGA 内存结构是oracle数据库最重要的组成部分之一,在数据库中的操作或多或少都会依赖到内存,是影响数据库性能的重要因素Oracle数据库中包括3个基本的内 ...

  4. oracle 的三个主要内存结构SGA,PGA,UGA

    SGA:全局的很大的共享内存段,几乎所有的ORACLE进程要访问: PGA: 一个进程或者线程专用的内存,其他进程或线程不能访问: UGA:此内存区与特定的会话相关联,可能在SGA中分配也可能在PGA ...

  5. oracle sga pga mysql_oracle实例内存(SGA和PGA)调整-xin

    一.名词解释 (1)SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. ( ...

  6. sga pga uga分配情况分析

    网络上流传着给Oracle数据库分配内存的一条法则:把80%的内存分配给Oracle使用,而又将这80%的内存分配80%给Oracle的SGA,剩下的20%分给Oracle的PGA.记得Tom曾说过类 ...

  7. Oracle12C SGA PGA UGA

    SGA和PGA简介 1 sga组成: 2b4p1s(记忆) database buffer cache:包括 default pool,keep pool,recycle pool: redo log ...

  8. oracle sga pga mysql_Oracle 体系结构 SGA 和PGA 总结

    SGA 和PGA 一.SGA SGA是由Oracle分个配的共享内存结构,包含一个数据库实例的数据和控制信息,SGA数据供所有的服务器进程和后台进程共享.所以又称为共享全局区.该内存区随着数据库实例的 ...

  9. oracle sga pga mysql_修改Oracle数据库SGA和PGA大小

    SGA的大小:一般物理内存20%用作操作系统保留,其他80%用于数据库. SGA普通数据库可以分配40%-60%之间,PGA可以分配20%-40%之间. 1.以dba身份登录 并查看SGA信息: SQ ...

最新文章

  1. 基于Pytorch对YOLOV5 进行简易实现
  2. 解决linux 升级高版本python3.7后yum不能使用的问题
  3. python闭包和函数调用区别_函数闭包与可调用类
  4. HTML5 Canvas API 变换(translate函数)
  5. 每日一题(23)——malloc与free(四)
  6. mapperscan注解_SpringBoot 遗忘后的简单快速回忆之环境搭建与常见注解
  7. Java连接Elasticsearch6.xxx 环境测试篇一
  8. SQL Server AlwaysOn读写分离配置
  9. D3 二次方曲线与切线
  10. arm跑操作系统的意义_不太远的猜想:当ARM和鸿蒙OS在笔记本领域相遇,颠覆已无可避免...
  11. 跟着例子一步步学习redux+react-redux[转载]
  12. 挣脱浏览器的束缚(6) - AJAX也跨域名
  13. 难以置信:某国产平台制定打包deb规范,竟然没有测试
  14. dell延长对显卡的保修服务
  15. java duplicate_java中出现duplicate local variable
  16. java fillrect_Java graphics2D fillRect无法使用半透明颜色正常...
  17. superset集成echarts--添加Line折线图
  18. 聊聊程序员如何用技术变现?
  19. python匿名函数Lambda的两种用法
  20. 【RocketMQ】玩转各种类型的消息

热门文章

  1. DeeplabV3+ 训练自己的数据集。pytorch
  2. 计算机教室日常维护制度,现代信息技术教室管理制度
  3. 用计算机播放vcd教案,六年级信息技术下册 第六课制作班级VCD1教案 华中师大版...
  4. 关于如何获得虚拟机还是真机信息
  5. Android 读取外设U盘(USB)文件。
  6. 基于Python的地理数据分析之一元线性回归分析-数学原理02.md
  7. 【C#】简单二维码制作和打印
  8. Linux(CentOS)学习笔记
  9. STM32 RTC时钟源LSE
  10. 资本教不会年轻人喝酒