`
wh870712
  • 浏览: 40335 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

对oracle实例的内存(SGA和PGA)进行调整,优化数据库性

阅读更多
一、示例:
SGA:

    共享池:200MB          

    缓冲区高速缓存:24MB   

    大型池:9MB

    Java池:32MB

    SAG总容量:264.933

    SAG的最大大小:305.069

PGA:

    总记PGA目标:240MB     

    分配的当前PGA:8914KB

    分配的最大PGA(自启动以来)9081KB

    高速缓存命中百分比:100%

    PGA和SGA的和应小于系统内存总量前去操作系统和其他应用程序所需内存后得到的值。

二、名词解释:

SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;

     系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。

     共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,

         主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)

         共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息

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

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

     Java池:ava Pool为Java命令的语法分析提供服务

PGA:Program Global Area是为每个连接到Oracle database的用户进程保留的内存。

三、分析与调整:

     1、系统全局域:

        SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/2到1/3,当然,如果服务器上只有oracle的话,

可以分配的更大一些,如果还有其他服务,如IIS等,那就要分的小一些。

     1、共享池:

        修改共享池的大小,ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

        查看共享SQL区的使用率:

            select(sum(pins-reloads))/sum(pins) "Library cache" from v$librarycache;--动态性能表

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

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

            select (sum(gets-getmisses-usage-fixed))/sum(gets) "Data dictionary cache" from v$rowcache;--动态性能表

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

     2、缓冲区高速缓存:

        它的大小要根据数据量来决定:

             SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB

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

            SELECT name,value FROM v$sysstat order by name WHERE name IN(''DB BLOCK GETS'',''CONSISTENT GETS'',''PHYSICAL READS'');

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

增加数据缓冲区的大小。

        select sum(pins) "请求存取数",sum(reloads) "不命中数",sum(reloads)/sum(pins) from v$librarycache 

     其中,pins,显示在库高速缓存中执行的次数;reload,显示在执行阶段库高速缓存不命中的数目,一般 sum(reloads)/sum(pins)的

值应接近于零.如果大于1%就应该增加shared_pool_size的值, 来提高数据字典高速缓存可用的内存数量,减少不命中数.

        通过动态性能表v$rowcache来查询数据字典高速缓存的活动: 

            select sum(gets) "请求存取数",sum(getmisses) "不命中数" from v$rowcache  

            其中,gets,显示请求相应项的总数; getmisses,显示造成高速缓存不命中的数据请求数.  

        Hit ratio与wait events:

            select value from $pgastat where name =''cache hit percentage''

            Hit ratio与wait events是此消彼涨,在执行类似于

            select col1,col2,.. from tab1 a where exists (

               select 1 from tab2 where a.col3 = b.col3

            )

            where ....

            的语句的时候,如果tab1的记录很多的话,你会发现系统的hit ratio会有很大的提高,wait events是否会改观呢.

     3、日志缓冲区

        SELECT name, value  FROM v$sysstat WHERE name IN (''redo entries'',''redo log space requests'')查看日志缓冲区的使用情况。

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

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

     3、大型池:

        可以减轻共享池的负担

        可以为备份、恢复等操作来使用

        不使用LRU算法来管理

其大小由数据库的‘共享模式/db模式’如果是共享模式的话,要分配的大一些

        指定Large Pool的大小,ALTER SYSTEM SET LARGE_POOL_SIZE=64M

     3、Java池:

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


如何估算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$process) /(select count(*) from v$process) from dual;得到一个process大约占用了多少的内存,然后估算系统一共会有多少连接,比如一共有500个连接,
那么Sessions=1.1*process +5=500,那么processes=450,再乘以一个process需要消耗的内存,就能大约估算出PGA需要设置多大。
最好将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.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2  FROM SYS.x$ksppi x, SYS.x$ksppcv y
3  WHERE x.inst_id = USERENV ('Instance')
4  AND y.inst_id = USERENV ('Instance')
5  AND x.indx = y.indx
6  AND x.ksppinm LIKE '%&par%'
7  /
NAME                                                                             VALUE                                                                            DESCRIB
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
_smm_max_size                                                                    20480                                                                            maximum work area size in auto mode (serial)
SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 100M
此处我的一个process能够分配的最大内存为20M,因为我的PGA=100M,符合上面的规则。
隐 含参数_smm_max_size表示一个process能够分配最大的memory.



买了piner的《oracle高可用环境》一书,正好趁这段时间学习一下。
把看到的东西总结一下发表于此,今天先发第一章关 于SGA与PGA的内容。

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

SGA与PGA的结构如下图:

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$sgastat记录了SGA的一些统计信息
V$sga_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$sqlarea 记录了所有sql的统计信息,包括执行次数、物理读、逻辑读、耗费时间等
V$sqltext_with_newline 完全显示sql语句,通过hash_value来标示语句,piece排序
V$sql_plan保存了sql的执行计划,通过工具查看
V$shared_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

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$db_cache_advice 对数据缓冲区的预测,可以做调整data buffer的参考

V$bh、 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%

分享到:
评论

相关推荐

    oracle实例的内存(SGA和PGA)进行调整,优化数据库性

    总之,优化Oracle实例的内存配置是一个持续的过程,需要定期监控数据库性能指标,分析查询模式,并根据业务需求灵活调整SGA和PGA的配置。通过精细化管理和调整,可以显著提高Oracle数据库的响应速度和吞吐量,从而更...

    Oracle的内存结构和进程结构

    Oracle实例是用户访问数据库的核心途径,它由系统全局区(SGA)和一系列后台进程组成。在操作系统层面,实例通过ORACLE_SID标识,而在Oracle数据库内部,这与INSTANCE_NAME参数的值匹配。 1. Oracle实例: 每个...

    Oracle数据库内存优化配置

    - SGA(System Global Area)是Oracle实例启动时为每一个进程分配的一组共享内存区域,包括上面提到的各个组成部分。合理设置SGA大小对于提升整体性能至关重要。 - 可以通过监控工具查看当前系统的负载情况,结合...

    Oracle数据库系统内存优化探讨.pdf

    系统全局区(SGA)是Oracle实例共享的数据存储区域,包括数据库高速缓存、重演日志缓存和共享池。数据库高速缓存用于存储从数据文件读取的数据块,减少I/O操作;重演日志缓存记录数据库变更以备恢复;共享池包含库缓存...

    更改ORACLE SGA的详细步骤

    Oracle 数据库的 System Global Area (SGA) 是一个共享内存区域,它包含了数据库运行所需的各种组件,例如数据缓冲区缓存、重做日志缓冲区、共享 SQL 区域等。当需要调整 SGA 大小以优化数据库性能时,需要遵循一定...

    oracle 内存优化

    SGA是Oracle数据库实例的核心组成部分,它是一组共享的内存结构,用于存储数据库实例的数据和控制信息。在多用户环境中,所有连接到数据库的用户都会共享SGA。当数据库实例启动时,SGA内存被分配,并在关闭时回收。...

    浅析HP小型机上Oracle数据库内存使用.pdf

    文章通过这个案例,强调了对Oracle数据库内存使用情况进行监控和优化的重要性。合理的内存分配和管理可以显著提高数据库的性能和稳定性。针对内存问题,可能需要调整Oracle数据库的初始化参数,如SGA和PGA的大小,...

    Oracle数据库与实例内存结构介绍.pptx

    Oracle 9i体系结构主要由Oracle数据库和Oracle实例两部分组成,数据库是实际存储数据的文件集合,而实例则是管理这些数据的后台进程和内存结构。 Oracle实例由系统全局区(SGA)和后台进程构成。SGA是一个共享内存...

    数据库设计与开发--ORACLE数据库实例管理.pptx

    在Oracle数据库实例管理中,理解并优化SGA和PGA的配置对于提升数据库性能至关重要。例如,合理设置缓冲区的数量和大小可以减少磁盘I/O,提高数据访问速度。而控制共享池的大小则有助于减少SQL语句的解析次数,降低...

    oracle内存全面分析

    - **监控与调整**:利用V$SGASTAT、V$PGASTAT等视图监控SGA和PGA的使用情况,通过调整相关参数优化内存使用效率。 总之,Oracle内存管理是确保数据库高性能的关键。深入了解SGA、PGA和UGA的内部机制,以及合理配置...

    减少Oracle内存占用

    Oracle数据库的内存结构主要由SGA和PGA两部分组成: 1. **SGA**(Shared Global Area):SGA是所有数据库进程共享的一块内存区域,它包含了多个子组件如数据缓冲区、重做日志缓冲区、共享池等。 - **数据缓冲区**...

    Oracle数据库_实例_用户_表空间之间的关系.doc

    - **共享内存结构**:主要包括系统全局区(SGA)和程序全局区(PGA),用于缓存数据和执行程序。 #### 三、用户(User) 用户是在Oracle实例下创建的,是数据库资源的使用者。用户可以拥有各种权限,包括创建表、视图、...

    Oracle数据库内存优化配置.pdf

    SGA是Oracle实例的核心组成部分,它包含了多个内存子区域,如共享池区、数据库高速缓冲区和重做日志缓冲区。PGA则是每个服务器进程(或称影子进程)的私有内存空间,用于处理用户进程与数据库之间的交互。 1. 共享...

    oracle基本知识+内存分析+数据库IO深入分析

    例如,数据库实例是由SGA(System Global Area)和PGA(Program Global Area)组成的内存结构,以及后台进程如何协同工作来处理用户请求。此外,还会介绍数据库的安全性机制,如用户权限、角色以及对象权限的管理。 ...

    oracle机制及内存区的优化建议

    1. **内存优化**:合理分配SGA和PGA的大小,避免内存争用,根据系统负载调整各个内存区域的大小。 2. **数据文件和表空间管理**:定期检查数据文件的利用率,合理规划表空间,避免单个文件过大导致的I/O瓶颈。 3. **...

    Oracle9i 动态SGA,PGA特性探索

    Oracle9i数据库系统引入了动态SGA(System Global Area)和PGA(Program Global Area)的特性,这使得数据库实例能够更有效地管理和优化内存资源。在Oracle9i之前,SGA和PGA的配置往往需要手动调整,以适应不同工作...

Global site tag (gtag.js) - Google Analytics