SGA和PGA调整

news/2025/3/13 3:58:29/

专业词汇解释

(1) SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 (2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)。  共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。 (3)缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 (4)大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。 (5)Java池:Java Pool为Java命令的语法分析提供服务。 (6)PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。

二、分析与调整

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

查看共享池大小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%以上,否则需要增加共享池的大小。
修改共享池的大小 :
ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

b.缓冲区高速缓存 Database Buffer Cache:
SQL> show parameter db_cache_size

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

SQL> SELECT name,value FROM v$sysstat  where name IN('DB BLOCK GETS','CONSISTENT GETS','PHYSICAL READS');  
SQL> SELECT * FROM V$SYSSTAT WHERE NAME IN ('parse_time_cpu','parse_time_elapsed','parse_count_ hard');

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

日志缓冲区

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

SQL> SELECT name, value  FROM v$sysstat WHERE name IN ('redo entries','redo log space requests');NAME								      VALUE
---------------------------------------------------------------- ----------
redo entries							      61127
redo log space requests 						  0查询出的结果可以计算出日志缓冲区的申请失败率:   
申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。 

大型池:

可以减轻共享池的负担,可以为备份、恢复等操作来使用,不使用LRU算法来管理。其大小由数据库的’共享模式/db模式’如果是共享模式的话,要分配的大一些。
指定Large Pool的大小:
ALTER SYSTEM SET 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> alter system set workarea_size_policy=auto scope=both;
System altered.
SQL> alter system set pga_aggregate_target=512m scope=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 536870912

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

V$PGASTAT:这个视图给出了一个实例级别的PGA内存使用和自动分配的统计。 
SQL> set lines 256 
SQL> set pages 42 
SQL> SELECT * FROM V$PGASTAT; 
NAME                                                                  VALUE UNIT 
---------------------------------------------------------------- ---------- ------------ 
aggregate PGA target parameter                                    536870912 bytes    
--当前PGA_AGGREGATE_TARGET的值 
aggregate PGA auto target                                         477379584 bytes    
--当前可用于自动分配了的PGA大小,应该比PGA_AGGREGATE_TARGET 小 
global memory bound                                                26843136 bytes    
--自动模式下工作区域的最大大小,Oracle根据工作负载自动调整。 
total PGA inuse                                                     6448128 bytes 
total PGA allocated                                                11598848 bytes   
--PGA的最大分配 
maximum PGA allocated                                             166175744 bytes 
total freeable PGA memory                                            393216 bytes    
--PGA的最大空闲大小 
PGA memory freed back to OS                                        69074944 bytes 
total PGA used for auto workareas                                         0 bytes    
--PGA分配给auto workareas的大小 
maximum PGA used for auto workareas                                 1049600 bytes 
total PGA used for manual workareas                                       0 bytes 
maximum PGA used for manual workareas                                530432 bytes 
over allocation count                                                  1118    
--实例启动后,发生的分配次数,如果这个值大于0,就要考虑增加pga的值 
bytes processed                                                   114895872 bytes 
extra bytes read/written                                            4608000 bytes 
cache hit percentage                                                  96.14 percent    
--命中率 
16 rows selected. 

–V$PGA_TARGET_ADVICE

SQL> SELECT round(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 like the following: 
TARGET_MB   CACHE_HIT_PERC ESTD_OVERALLOC_COUNT 
---------- -------------- -------------------- 
63         23          367 
125        24          30 
250        30          3 
375        39          0 
500        58          0 
600        59          0 
700        59          0 
800        60          0 
900        60          0 
1000       61          0 
1500       67          0 
2000       76          0 
3000       83          0 
4000       85          0 
可以看出当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=(Total Memory)*80%*20%。
DSS系统PGA=(Total Memory)*80%*50%。 

ORACLE建议一个数据库服务器,分80%的内存给数据库,20%的内存给操作系统,那怎么给一个数据库服务器配内存呢?
SQL> select * from v$pgastat;
NAME VALUE UNIT


aggregate PGA target parameter 104857600 bytes
-----这个值等于参数PGA_AGGREGATE_TARGET的值,如果此值为0,表示禁用了PGA自动管理。
aggregate PGA auto target 75220992 bytes
-----表示PGA还能提供多少内存给自动运行模式,通常这个值接近pga_aggregate_target-total pga inuse.
global memory bound 20971520 bytes
-----工作区执行的最大值,如果这个值小于1M,马上增加PGA大小
total PGA inuse 30167040 bytes
-----当前分配PGA的总大小,这个值有可能大于PGA,如果PGA设置太小.这个值接近select sum(pga_used_mem) from v$process.
total PGA allocated 52124672 bytes
-----工作区花费的总大小
maximum PGA allocated 67066880 bytes
total freeable PGA memory 0 bytes ----没有了空闲的PGA
process count 23 ----当前一个有23个process
max processes count 25
PGA memory freed back to OS 0 bytes
total PGA used for auto workareas 8891392 bytes
maximum PGA used for auto workareas 22263808 bytes
total PGA used for manual workareas 0 bytes —为0自动管理
maximum PGA used for manual workareas 0 bytes —为0自动管理
over allocation count 0
–如果PGA设置太小,导致PGA有时大于PGA_AGGREGATE_TARGET的值,此处为0,说明PGA没有扩展大于TARGET的值,如 果此值出现过,那么增加PGA大小。
bytes processed 124434432 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent
—命中率为100%,如果太小增加PGA
recompute count (total) 6651
19 rows selected

SQL> select max(pga_used_mem)/1024/1024 M from v$process;   ----当前一个process消耗最大的内存 
M
----------
9.12815189 SQL> select min(pga_used_mem)/1024/1024 M from v$process where pga_used_mem>0;  ---process消耗最少内存 
M
----------
0.19186878 SQL> select max(pga_used_mem)/1024/1024 M from v$process ;    ----process曾经消耗的最大内存 
M
----------
9.12815189 SQL> select sum(pga_used_mem)/1024/1024 from v$process;   ----当前process一共消耗的PGA 
SUM(PGA_USED_MEM)/1024/1024
---------------------------
28.8192501068115 

如何设置PGA呢?我们可以在压力测试阶段,模拟一下系统的运行,然后运行
select (select sum(pga_used_mem)/1024/1024 from v p r o c e s s ) / ( s e l e c t c o u n t ( ∗ ) f r o m v process) /(select count(*) from v process)/(selectcount()fromvprocess) from dual;
得到一个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的大小,建议还是多配点内存,反正便宜。

查看SGA:

Sqlp> show sga 或 select * from v$sga;
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 176161448 bytes
Database Buffers 109051904 bytes
Redo Buffers 2945024 bytes

Fixed Size:包括了数据库与实例的控制信息、状态信息、字典信息等,启动时就被固定在SGA中,不会改变。
Variable Size:包括了shard pool、large pool、java pool、stream pool、游标区和其他结构
Database Buffers:数据库中数据块缓冲的地方,是SGA中最大的地方,决定数据库性能
Redo Buffers:提供REDO缓冲的地方,在OLAP中不需要太大
V s g a s t a t 记录了 S G A 的一些统计信息 V sgastat记录了SGA的一些统计信息 V sgastat记录了SGA的一些统计信息Vsga_dynamic_components 保存SGA中可以手动调整的区域的一些调整记录

Shard pool:

Shard_pool_size决定其大小,10g以后 自动管理
Shard_pool中数据字典和控制区结构用户无法直接控制,与用户有关的只有sql缓冲区(library cache)。
将 经常访问的过程或包用DBMS_SHARED_POOL.KEEP存储过程将该包pin在共享池中。
手工清除共享池的内容:alter system flush shard_pool;
共享池相关的几个常用的视图:
V s q l a r e a 记录了所有 s q l 的统计信息,包括执行次数、物理读、逻辑读、耗费时间等 V sqlarea 记录了所有sql的统计信息,包括执行次数、物理读、逻辑读、耗费时间等 V sqlarea记录了所有sql的统计信息,包括执行次数、物理读、逻辑读、耗费时间等Vsqltext_with_newline 完全显示sql语句,通过hash_value来标示语句,piece排序
V s q l p l a n 保存了 s q l 的执行计划,通过工具查看 V sql_plan保存了sql的执行计划,通过工具查看 V sqlplan保存了sql的执行计划,通过工具查看Vshared_pool_advice 对共享池的预测,可以做调整SGA的参考

Data buffer:
在OLTP系统中要求data buffer 的命中率在95%以上

select sum(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';

PINS NUMBER Number of times a PIN was requested for objects of this namespace
PINHITS NUMBER Number of times all of the metadata pieces of the library object were found in memory
RELOADS NUMBER Any PIN of an object that is not the first PIN performed since the object handle was created, and which requires loading the object from disk

Oracle把从data buffer中获得的数据库叫cache hit,把从磁盘获得的脚cache miss
数据缓冲 区中的数据块通过脏列表(dirty list)和LRU列表(LRU list)来管理。
Data buffer可细分为: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 d b c a c h e a d v i c e 对数据缓冲区的预测,可以做调整 d a t a b u f f e r 的参考 V db_cache_advice 对数据缓冲区的预测,可以做调整data buffer的参考 V dbcacheadvice对数据缓冲区的预测,可以做调整databuffer的参考Vbh、 x$bh记录了数据块在data buffer中缓冲的情况,通过这个视图可以找系统中的热点块。

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

Select /*+ rule*/ owner,object_name from dba_objects
Where data_object_id in
(select obj from (select obj from x$bh order by tch desc)
Where rownum<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、 data buffer、 large pool都不用手工指定了,Oracle会自动管理。这一特性就是自动共享内存管理ASMM。如果设置了sga_target=0,就自动关闭自动共享内 存管理功能。Sga_target大小不能超过sga_max_size的大小。
手动管理SGA:
Alter system set sga_target=2000m;
Alter system set db_cache_size=1000m;
Alter system set shared_pool=200m;
Alter system set sga_target=0---------关闭自动共享内存管理ASMM
11G以后sga+pga整个内存可以自动管理AMM,相关 参数memory_max_target memory_target.设置好这两个参数后就不用关心SGA和PGA了
11g手动内存管理:
Alter system set memory_target=3000m;
Alter system set sga_target=2000m;
Alter system set pga_aggregate_target=1000m;
Alter system set memory_target=0;---------关闭自动内存管理AMM
SGA+PGA最好不要超过总内存的70%


http://www.ppmy.cn/news/66617.html

相关文章

去阿里面试,面试前20分钟突然要求候选人展示过去的工作方案,候选人拒绝后,竟被取消面试!...

离职时&#xff0c;你会把自己的工作成果拷贝下来留档吗&#xff1f; 一位网友说&#xff1a; 面试阿里&#xff0c;面试前20分钟&#xff0c;面试官突然要求他展示过去的工作成果&#xff0c;因为之前是用公司电脑&#xff0c;离职时把电脑交上去了&#xff0c;没有任何留档&a…

linux系统函数的运用

函数 函数详解函数的作用函数的定义函数的返回值函数的作用范围函数传参函数递归函数库 函数详解 函数的作用 在编写shell脚本的时候&#xff0c;经常会发现在多个地方使用了同一段代码&#xff0c;如果只是一小段代码&#xff0c;一般也无关紧要&#xff0c;但是要在脚本中多…

RabbitMQ消息队列实战(5)—— 发后即忘和远程RPC数据传输模型

本文我们学习下使用RabbitMQ实现的几种数据发送的模型——发后即忘模型和远程RPC调用。二者实际上是从业务的角度定义的一个RabbitMQ的使用模型。发后即忘模型&#xff0c;强调发送时不太关心消息接收者的执行结果&#xff0c;仅仅是为了发送信息。而远程RPC调用模型强调&#…

Kali-linux应用更新和配置额外安全工具

本节将介绍更新Kali的过程和配置一些额外的工具。这些工具在后面的章节中将是有用的。Kali软件包不断地更新和发布之间&#xff0c;用户很快发现一套新的工具比最初在DVD ROM上下载的软件包更有用。本节将通过更新安装的方法&#xff0c;获取Nessus的一个激活码。最后安装Squid…

KingbaseES 复制冲突之锁类型冲突

背景 昨天遇到客户现场的一个有关复制冲突的问题 备库报错&#xff1a;ERROR: canceling statement due to conflict with recovery&#xff0c;user was holding a relation lock for too long 现场情景是备库执行逻辑备份过程中出现的报错&#xff0c;逻辑备份相当于备库查询…

yolov5 用自己的数据集进行训练

在训练之前先要按照一定目录格式准备数据&#xff1a; VOC标签格式转yolo格式并划分训练集和测试集_爱钓鱼的歪猴的博客-CSDN博客 目录 1、修改数据配置文件 2、修改模型配置文件 3、训练 1、修改数据配置文件 coco.yaml 拷贝data/scripts/coco.yaml文件&#xff0c; pa…

k8s二进制搭建|ETCD + Flannel | 单节点部署 | 多节点的部署|dashbord的部署

k8s二进制搭建|ETCD Flannel | 单节点部署 | 多节点的部署|dashbord的部署 二进制搭建 Kubernetes v1.201 初始化环境2 部署 docker引擎3 在mster 192.168.10.10上操作4 在 node01 192.168.10.20节点上操作5 在 node02 192.168.10.30节点上操作6 检查etcd群集状态7 部署 Maste…

Java设计模式(二十二)策略模式

一、概述 策略模式是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的策略类&#xff0c;使得它们可以相互替换&#xff0c;而不影响使用算法的客户端。这样可以使客户端代码与具体算法的实现细节解耦&#xff0c;提高了代码的可…