一、名词解释

(1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。

(2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Librarycache(共享SQL区)和Datadictionarycache(数据字典缓冲区)。 共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。

(3)缓冲区高速缓存:DatabaseBufferCache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。

(4)大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。

(5)Java池:Java Pool为Java命令的语法分析提供服务。

(6)PGA:ProcessGlobal Area是为每个连接到Oracledatabase的用户进程保留的内存。

二、分析与调整

(1)系统全局域:

SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/3到1/2。

a.共享池Shared Pool:

查看共享池大小Sql代码

SQL>show parameter shared_pool_size

 

查看共享SQL区的使用率:

Sql代码

select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache;

--动态性能表

LIBRARY命中率应该在90%以上,否则需要增加共享池的大小。

查看数据字典缓冲区的使用率:

Sql代码

select(sum(gets-getmisses-usage-fixed))/sum(gets)"Data dictionary cache"from v$rowcache;

--动态性能表

这个使用率也应该在90%以上,否则需要增加共享池的大小。

 

修改共享池的大小:

Sql代码

ALTERSYSTEMSET SHARED_POOL_SIZE =64M;

b.缓冲区高速缓存DatabaseBufferCache:

查看共享池大小Sql代码

SQL>show parameter db_cache_size

 

查看数据库数据缓冲区的使用情况:

Sql代码

SELECTname,valueFROM v$sysstat orderbynameWHEREnameIN(''DBBLOCK GETS'',''CONSISTENT GETS'',''PHYSICALREADS'');

 

SELECT * FROM V$SYSSTAT WHERENAMEIN('parse_time_cpu','parse_time_elapsed','parse_count_ hard');

计算出来数据缓冲区的使用命中率=1-(physicalreads/(dbblock gets+consistent gets)),这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。

 

c.日志缓冲区

查看日志缓冲区的使用情况:

Sql代码

SELECTname,valueFROM v$sysstat WHEREnameIN('redo entries','redo log space requests')

查询出的结果可以计算出日志缓冲区的申请失败率:

申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。

 

d.大型池:

可以减轻共享池的负担,可以为备份、恢复等操作来使用,不使用LRU算法来管理。其大小由数据库的'共享模式/db模式'如果是共享模式的话,要分配的大一些。

指定Large Pool的大小:

Sql代码

ALTERSYSTEMSET LARGE_POOL_SIZE=64M

 

e.Java池:

在安装和使用Java的情况下使用。

 

(2)PGA调整

a.PGA_AGGREGATE_TARGET初始化设置

PGA_AGGREGATE_TARGET的值应该基于Oracle实例可利用内存的总量来设置,这个参数可以被动态的修改。假设Oracle实例可分配4GB的物理内存,剩下的内存分配给操作系统和其它应用程序。你也许会分配80%的可用内存给Oracle实例,即3.2G。现在必须在内存中划分SGA和PGA区域。

 

在OLTP(联机事务处理)系统中,典型PGA内存设置应该是总内存的较小部分(例如20%),剩下80%分配给SGA。

OLTP:PGA_AGGREGATE_TARGET=(total_mem * 80%) * 20%=2.5G

 

在DSS(数据集)系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。

DSS:PGA_AGGREGATE_TARGET=(total_mem * 80%) * 50%

 

在这个例子中,总内存4GB,DSS系统,你可以设置PGA_AGGREGATE_TARGET为1600MB,OLTP则为655MB。

 

b.配置PGA自动管理

不用重启DB,直接在线修改。

SQL>altersystemset workarea_size_policy=autoscope=both;

System altered.

SQL>altersystemset pga_aggregate_target=512mscope=both;

System altered.

SQL>show parameter workarea

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy                 string      AUTO  --这个设置成AUTO

 

SQL>show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 500M

 

c.监控自动PGA内存管理的性能

V$PGASTAT:这个视图给出了一个实例级别的PGA内存使用和自动分配的统计。

 

SQL>set lines 256

SQL>set pages 42

SQL>SELECT * FROM V$PGASTAT;

 

NAMEVALUE UNIT

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

aggregate PGA target parameter536870912 bytes

--当前PGA_AGGREGATE_TARGET的值

aggregate PGAauto target 477379584 bytes

--当前可用于自动分配了的PGA大小,应该比PGA_AGGREGATE_TARGET小

globalmemorybound26843136 bytes

--自动模式下工作区域的最大大小,Oracle根据工作负载自动调整。

total PGA inuse6448128 bytes

total PGA allocated11598848 bytes

--PGA的最大分配

maximum PGA allocated166175744 bytes

total freeable PGAmemory393216 bytes

--PGA的最大空闲大小

PGAmemory freed back to OS 69074944 bytes

total PGA usedforauto workareas 0 bytes

--PGA分配给auto workareas的大小

maximum PGA usedforauto workareas 1049600 bytes

total PGA usedformanual workareas 0 bytes

maximum PGA usedformanual workareas 530432 bytes

over allocation count1118

--实例启动后,发生的分配次数,如果这个值大于0,就要考虑增加pga的值

bytes processed114895872 bytes

extra bytesread/written4608000 bytes

cache hit percentage 96.14percent

--命中率

16rows selected.

--V$PGA_TARGET_ADVICE

 

SQL>SELECTround(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,

ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,

ESTD_OVERALLOC_COUNT

FROM v$pga_target_advice;

The output of this query might look likethefollowing:

 

TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT

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

6323367

1252430

250303

375390

500580

600590

700590

800600

900600

1000610

1500670

2000760

3000830

4000850

 

可以看出当TARGET_MB为375M是ESTD_OVERALLOC_COUNT=0,所以可以将PGA_AGGREGATE_TARGET设置成375M。

 

附:oracle SGA与PGA区别:

SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反,PGA是只被一个进程使用的区域,PGA在创建进程时分配,在终止进程时回收。

 

另一篇文章中也这样写了相关的调整记录

 

如何估算PGA,SGA的大小,配置数据库服务器的内存

ORACLE给的建议是: OLTP系统PGA=(TotalMemory)*80%*20%。

DSS系统PGA=(TotalMemory)*80%*50%。

ORACLE建议一个数据库服务器,分80%的内存给数据库,20%的内存给操作系统,那怎么给一个数据库服务器配内存呢?

SQL>select * from v$pgastat;

NAMEVALUE UNIT

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

aggregate PGA target parameter104857600 bytes

-----这个值等于参数PGA_AGGREGATE_TARGET的值,如果此值为0,表示禁用了PGA自动管理。

aggregate PGAauto target 75220992 bytes

-----表示PGA还能提供多少内存给自动运行模式,通常这个值接近pga_aggregate_target-total pga inuse.

globalmemorybound20971520 bytes

-----工作区执行的最大值,如果这个值小于1M,马上增加PGA大小

total PGA inuse30167040 bytes

-----当前分配PGA的总大小,这个值有可能大于PGA,如果PGA设置太小.这个值接近select sum(pga_used_mem) from v$process.

total PGA allocated52124672 bytes

-----工作区花费的总大小

maximum PGA allocated67066880 bytes

total freeable PGAmemory0 bytes ----没有了空闲的PGA

processcount23----当前一个有23个process

max processes count25

PGAmemory freed back to OS 0 bytes

total PGA usedforauto workareas 8891392 bytes

maximum PGA usedforauto workareas 22263808 bytes

total PGA usedformanual workareas 0 bytes ---为0自动管理

maximum PGA usedformanual workareas 0 bytes ---为0自动管理

over allocation count0

--如果PGA设置太小,导致PGA有时大于PGA_AGGREGATE_TARGET的值,此处为0,说明PGA没有扩展大于TARGET的值,如果此值出现过,那么增加PGA大小。

bytes processed124434432 bytes

extra bytesread/written0 bytes

cache hit percentage 100percent

---命中率为100%,如果太小增加PGA

recomputecount(total)6651

19rows selected

SQL>selectmax(pga_used_mem)/1024/1024Mfrom v$process;

----当前一个process消耗最大的内存

M

----------

9.12815189

SQL>selectmin(pga_used_mem)/1024/1024Mfrom v$process where pga_used_mem>0;---process消耗最少内存

M

----------

0.19186878

SQL>selectmax(pga_used_mem)/1024/1024Mfrom v$process ;

----process曾经消耗的最大内存

M

----------

9.12815189

SQL>selectsum(pga_used_mem)/1024/1024from v$process;----当前process一共消耗的PGA

SUM(PGA_USED_MEM)/1024/1024

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

28.8192501068115

如何设置PGA呢?我们可以在压力测试阶段,模拟一下系统的运行,然后运行

select(selectsum(pga_used_mem)/1024/1024from v$process)/(selectcount(*)from v$process)fromdual;

得到一个process大约占用了多少的内存,然后估算系统一共会有多少连接,比如一共有500个连接,

那么sessions=1.1*process+5=500,那么processes=450,

再乘以一个process需要消耗的内存,就能大约估算出PGA需要设置多大。

 

EG = 1.1 * 450 = 495M估算的大一点550M就OK乐

 

最好将PGA设置的值比计算出的值大一点,PGA值设定好后,就可以根据系统的性质,如果系统为OLTOP,那么总的内存可以设置为PGA/0.16,最后也能估算出SGA的大小,建议还是多配点内存,反正便宜。

 

 

下面摘抄eygle的关于一个process能够分配的最大内存(串行操作)的规则:

10gR1之前,对于串行操作(非并行)一个process能够分配的最大的内存为min(5%pga_aggregate_target,100m)

10gR2之后,对于串行操作(非并行)一个process能够分配的最大内存有如下规则:

如果pga_aggregate_target<=500m,那么最大的内存为20%*pga_aggregate_target.

如果500m<pga_aggregate_target<=1000m,那么最大内存为100m.

如果1000m<pga_aggregate_target<=2.5G,那么最大内存为10%*pga_aggregate_target.

如果pga_aggregate_target>2.5G,那么最大内存为2.5G.

SQL>SELECT x.ksppinmNAME, y.ksppstvlVALUE, x.ksppdesc describ

FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.inst_id=USERENV('Instance')

AND y.inst_id=USERENV('Instance')AND x.indx= y.indxAND x.ksppinmLIKE'%&par%'

 

 

NAMEVALUE DESCRIB

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

_smm_max_size20480 maximum work area sizeinautomode(serial)

SQL>show parameter pga

NAMETYPEVALUE

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

pga_aggregate_target biginteger100M

此处我的一个process能够分配的最大内存为20M,因为我的PGA=100M,符合上面的规则。

隐含参数_smm_max_size表示一个process能够分配最大的memory.

 

 

 

 

 

 

买了piner的《oracle高可用环境》一书,正好趁这段时间学习一下。

把看到的东西总结一下发表于此,今天先发第一章关于SGA与PGA的内容。

 

以后会陆续将总结在此发表,与大家共享。

 

SGA与PGA的结构如下图:

 

SGA:

查看SGA:

Sqlp>show sga

或select * from v$sga;

TotalSystemGlobal Area 289406976 bytes

FixedSize1248600 bytes

VariableSize176161448 bytes

Database Buffers 109051904 bytes

Redo Buffers2945024 bytes

 

FixedSize:包括了数据库与实例的控制信息、状态信息、字典信息等,启动时就被固定在SGA中,不会改变。

VariableSize:包括了shard pool、large pool、java pool、stream pool、游标区和其他结构

Database Buffers:数据库中数据块缓冲的地方,是SGA中最大的地方,决定数据库性能

Redo Buffers:提供REDO缓冲的地方,在OLAP中不需要太大

 

V$sgastat记录了SGA的一些统计信息

V$sga_dynamic_components保存SGA中可以手动调整的区域的一些调整记录

 

Shard pool:

Shard_pool_size决定其大小,10g以后自动管理

Shard_pool中数据字典和控制区结构用户无法直接控制,与用户有关的只有sql缓冲区(librarycache)。

将经常访问的过程或包用DBMS_SHARED_POOL.KEEP存储过程将该包pin在共享池中。

手工清除共享池的内容:altersystemflush shard_pool;

 

共享池相关的几个常用的视图:

V$sqlarea记录了所有sql的统计信息,包括执行次数、物理读、逻辑读、耗费时间等

V$sqltext_with_newline完全显示sql语句,通过hash_value来标示语句,piece排序

V$sql_plan保存了sql的执行计划,通过工具查看

V$shared_pool_advice对共享池的预测,可以做调整SGA的参考

 

Databuffer:

 

在OLTP系统中要求databuffer的命中率在95%以上

selectsum(pins)"execution",sum(pinhits)"hits",

((sum(pinhits)/sum(pins))*100)"pinhitration",

sum(reloads)"misses",((sum(pins)/(sum(pins)

+sum(reloads)))*100)"relhitratio"

from V$librarycache

 

计算命中率的语句

select round((1 - (physical.value - direct.value - lobs.value)/logical.value)*100,2) "Buffer Cache Hit Ratio"

from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical

where physical.name ='physical reads'

and direct.name ='physical reads direct'

and lobs.name ='physical reads direct (lob)'

and logical.name ='session logical reads';

 

 

PINSNUMBERNumberof times a PIN was requested for objects of this namespace

PINHITSNUMBERNumberof times allofthe metadata pieces ofthelibraryobject were foundinmemory

RELOADSNUMBERAny PIN of an object that isnotthefirst PIN performed since theobject handle was created,and which requires loading theobjectfromdisk

 

Oracle把从databuffer中获得的数据库叫cache hit,把从磁盘获得的脚cache miss

数据缓冲区中的数据块通过脏列表(dirtylist)和LRU列表(LRUlist)来管理。

 

Databuffer可细分为:default pool、keep pool、recycle pool对应的参数为db_cache_size、db_keep_cache_size、db_recycle_size分别表示缓冲区大小

 

从9i开始oracle支持不同块大小的表空间,相应的可以为不同块大小的表空间指定不同块大小的数据缓冲区,不同块大小的数据缓冲区可以用相应的db_nk_cache_size来指定,其中n可以是2、4、6、16或32

 

V$db_cache_advice对数据缓冲区的预测,可以做调整databuffer的参考

 

V$bh、x$bh记录了数据块在databuffer中缓冲的情况,通过这个视图可以找系统中的热点块。

通过下面语句找系统中top10热点快所在的热点对象:

 

Select/*+ rule*/ owner,object_namefrom dba_objects

Where data_object_id in

(select obj from

(select obj from x$bh orderby tch desc)

Whererownum<11);

 

PGA:

用来保存于用户进程相关的内存段。

从9i开始使用PGA自动管理,pga_aggregate_target参数指定session一共使用的最大PGA内存的上限。Workarea_size_policy参数用于开关PGA内存自动管理功能,auto/manual

 

在OLTP环境中,自动PGA管理只要设置到一定的值,如2G左右就能满足系统的要求。

 

自动内存管理:

从9i开始,sga_max_size参数设置SGA的内存大小,不能动态修改

 

从10g开始,指定了sga_target参数后,所有的SGA组件如:shared pool、databuffer、large pool都不用手工指定了,Oracle会自动管理。这一特性就是自动共享内存管理ASMM。如果设置了sga_target=0,就自动关闭自动共享内存管理功能。Sga_target大小不能超过sga_max_size的大小。

手动管理SGA:

Altersystemset sga_target=2000m;

Altersystemset db_cache_size=1000m;

Altersystemsetshared_pool=200m;

Altersystemset sga_target=0---------关闭自动共享内存管理ASMM

 

11G以后sga+pga整个内存可以自动管理AMM,相关参数memory_max_target memory_target.设置好这两个参数后就不用关心SGA和PGA了

11g手动内存管理:

Altersystemset memory_target=3000m;

Altersystemset sga_target=2000m;

Altersystemset pga_aggregate_target=1000m;

Altersystemset memory_target=0;---------关闭自动内存管理AMM

 

SGA+PGA最好不要超过总内存的70%
————————————————
版权声明:本文为CSDN博主「越努力越幸运再努力」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37253968/article/details/89224941

Oracle 内存(SGA,PGA)详细介绍的更多相关文章

  1. 这篇关于Oracle内存管理方式的介绍太棒了!我必须要转发,很全面。哈哈~

    "Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...

  2. ORACLE内存结构:PGA And UGA,ORACLE用户进程、服务器进程

    执行一个SQL语句 执行查询语句的过程: 用户进程执行一个查询语句如select * from emp where empno=7839 用户进程和服务器进程建立连接,把改用户进程的信息存储到PGA的 ...

  3. oracle 创建表空间详细介绍

    注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[D:\oracle\oradata\Oracle9i\]也就是你要保存文件的路径存 ...

  4. Oracle内存全面分析

    Oracle内存全面分析 Oracle的内存配置与oracle性能息息相关.而且关于内存的错误(如4030.4031错误)都是十分令人头疼的问题.可以说,关于内存的配置,是最影响Oracle性能的配置 ...

  5. oracle内存分析

    oracle时间内存=SGA+PGA SGA(System Global Area):由所有服务进程和后台进程共享: PGA(Program Global Area):由每个服务进程.后台进程专有:每 ...

  6. oracle中增加pga和sga

    修改oracle数据库SGA和PGA大小 个人原创,允许转载,请注明出处,作者,否则追究法律责任. SGA的大小:一般物理内存20%用作操作系统保留,其他80%用于数据库.SGA普通数据库可以分配40 ...

  7. Oracle Merge into 详细介绍

    Oracle Merge into 详细介绍 /*Merge into 详细介绍MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查 ...

  8. 本文将详细介绍oracle 10g OEM常规错误

    本文将详细介绍oracle 10g OEM常规错误-------Unknown host specified解决方法,需要了解的朋友可以参考下 详细出处参考:http://www.jb51.net/a ...

  9. 转 Oracle 11g服务详细介绍

    转自http://www.cnblogs.com/userWuLiang/archive/2013/04/13/3017900.html Oracle 11g服务详细介绍及哪些服务是必须开启的? 成功 ...

  10. 【转】oracle内存分配和调优总结

    转自 http://blog.itpub.net/12272958/viewspace-696834/ 一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且 ...

随机推荐

  1. IM开发干货分享:如何优雅的实现大量离线消息的可靠投递

    1.点评 IM聊天消息的可靠投递,是每个线上产品都要考虑的IM热点技术问题. IM聊天消息能保证可靠送达,对于用户来说,就好比把钱存在银行不怕被偷一样,是信任的问题.试想,如果用户能明显感知到聊天消息 ...

  2. 按部就班--从零开始建设k8s监控(二)

    前言 书接上文,prometheus已经安装好了,并且能够对k8s的整体状态进行监控,但是我们还需要更多 环境准备 组件 版本 操作系统 Ubuntu 22.04.4 LTS docker 24.0. ...

  3. 无法安装Windows沙盒:在固件中禁用了虚拟化支持,操作无法安装hyoer-v该固件中的虚拟化支持被禁用问题

    windows10系统"无法安装Windows沙盒:在固件中禁用了虚拟化支持",另外操作无法安装hyoer-v该固件中的虚拟化支持被禁用问题. 解决办法: 我这里以联想拯救者r72 ...

  4. threejs 实现镜面反射,只反射指定物体,背景透明

    一.背景 最近在做数字孪生项目,使用threejs渲染模型,UI要求地面反射建筑物,也就是模型要有倒影. 二.调研 在官网找到一个镜面反射的例子(https://threejs.org/example ...

  5. uni-app组件 信息列表组件

    之前我一直在,要想提高自己的代码质量, 就一定要封装自己的组件, 所以我就尽量使用自己的组件.这样可以提高自己的效率 写组件的好处:减少代码的冗余 封装组件的时候,为了不让子元素的padding, 影 ...

  6. C#正则提取字符串中的数字

    首先需要引入命名空间System.Text.RegularExpressions,具体实现如下所示: //提取纯数字,该方式会将所有数字提取出来并拼接在一起,如:"ABC#123@AS456 ...

  7. Linux安装fastdfs图片服务器

    1.阿里云安装centos7服务器 得到用户名密码和ip后用securCrt连接工具链接远程主机 2.安装fastdfs图片服务器 (1)上传需要的压缩包 libfastcommon-common.z ...

  8. FreeSql学习笔记——1.入门

    前言 学习过程中,使用的是.Net 5 WebApi项目,数据库使用的是SQL Server,主要会整理下常用的api,现在就开始吧~   初始化 先选择一个WebCoreApi项目进行创建,创建完项 ...

  9. Drasi Reactions SDK

    Drasi Reactions SDK 是一个跨语言的开发工具包,用于实现和处理 Drasi 平台的 Reactions(反应器)功能.该 SDK 目前支持三种主流编程语言:JavaScript/Ty ...

  10. c# 删除文件夹最快的函数方法 无视占用 直接删除

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/17270147.html 代码如下,直接通过cmd调用dos命令进行删除 public stat ...