深入解析Oracle学习笔记(第五章)

PGA              非共享内存                 Server Process使用(排序,连接等操作也可能会用到)             排他访问,所以不需要latch保护

通常来说,包含私有SQL区,session信息等。(在可变PGA中)

一个私有SQL区在cursor打开时分配,当执行结束游标释放后关闭。


设置了PAG_AGGREGRATE_TARGET参数后,_use_realfree_heap参数自动设置为true,UGA(执行排序、哈希连接等操作,耗用大量内存)单独分配内存,不在PGA中分配,使用完成后直接释放给OS,而不是PGA,避免了PGA过度使用。


PGA由一系列内存区域组成,这些区域由*_area_size参数控制,8i中这些参数主要有sort_area_size、hash_area_size、bitmap_area_size、create_bitmap_area_size。每个部分大小固定,不能自动调整。9i开始引入自动PGA管理。PGA_AGGREGATE_TARGET所有session总计可用的PAG大小。WORKAREA_SIZE_POLICY 自动PGA管理功能的开关,AUTO或者MANUAL。


P_A_T参数会在CBO模式下,会对sql执行计划产生影响,因为oracle会根据P_A_T参数评估sort hash等操作所能使用的最大内存,选择最优执行计划。

建议:OLTP  物理内存*80%*20%               DSS 物理内存*80% *50%

v$process可以查看每个进程PGA使用量

v$process_memory查看每个进程的PGA内存消耗在什么地方


sql在工作区中执行的三种方式  workarea executions

optimal   全部在内存中完成      最好是这样,否则性能不好

onepass 大部分在内存中,但需要用到磁盘

multipass 用到大量磁盘


自动PGA管理采用反馈环实现。


v$pga_target_advice   PGA设置建议

v$pga_target_advice_histogram


oracle使用32位来存储SCN值。。。。。。。?4+2Bytes?


x$KSMMEM记录了整个SGA的地址映射关系。64位平台,每条记录代表8Bytes。


9i之前 db_block_buffers * db_block_size  = Buffer cache size

9i开始,使用db_cache_size,最小值为一个粒度,粒度大小取决于SGA的总大小。 4M或者16M。

各内存组件所使用的Granule大小可以通过动态性能视图v$sga_dynamic_components查询。


buffer cache 

LRU  

多缓冲池技术:default  keep  recycle

创建或修改表时,可以设置这张表使用哪个池。

db_cache_size         db_keep_cache_size      db_recycle_cache_size 


多块大小支持     db_nk_cache_size


log_buffer   静态参数


large pool  可选组件,通常用于共享服务器模式,并行计算,或RMAN的备份恢复操作。


9i中 varibale size 包括shared pool    java pool   large pool


redo buffers比log_buffers 略大。


SGA的设置,和操作系统内核参数shmmax参数有关,系统允许的单个共享内存段的最大值。如果该参数小于SGA的设置,SGA仍能创建成功,但会被分配多个共享内存段。推荐通过调整该参数,将SGA限制在一个共享内存段中。

ipcs  -sa


如果数据库异常关闭,后台进程未正常退出,共享内存可能未及时释放,此时可以通过ipcs命令找到共享内存段id (shared memory id),然后通过ipcrm命令释放该共享内存段。


8i  SGA各部分的大小在参数文件中写好,不能修改,修改必须重启实例。

9i开始可以动态调整,设置SGA_MAX_SIZE,本质上是在进程中预先分配一段虚拟地址备用,而不分配物理内存,防止和进程私有地址段的冲突。此时可以动态修改SGA各内存组件的大小。只要总的大小不超过SGA_MAX_SIZE,都可以立即生效。


buffer cache advisory受参数DB_CACHE_ADVICE控制,可以开启或关闭。

对于shared pool的建议则受到STATISTICS_LEVEL的影响,设置为TYPICAL。这是系统缺省配置,手机大部分统计信息,为了从oracle不断增加的新特性中受益,始终应将该参数设置为典型。可以查看v$statistics_level视图来查看该参数的影响范围。

v$shared_pool_advice


修改参数时,等待事件为background parameter adjustment。锁定类型为PE。


10g开始,可以自动的动态调整(ASMM),不需要手动动态调整。SGA_TARGET。通过引入该参数,让oracle自动管理SGA中大多数的内存分配。redo log buffer大小不能自动调整。可以自动调整的包括buffer cache,java pool,large pool,shared pool。SGA_TARGET设置为非0值,则启动ASMM,设为0,则禁用ASMM。
自动调整的大小,会记录在spfile中,数据库实例重启不会丢失之前调整的结果。
MMAN (Memory Manager)后台进程用来动态调整内存组件。动态调整的依据来自系统不间断收集的内存建议。
通过 v$sga_dynamic_componments  可以看到各动态组件调整的时间和调整类型等信息。


11g开始,AMM(automatic memory management)SGA和PGA都纳入了自动管理的范畴。
9i中引入了自动PGA,P_A_T。10g中自动SGA,sga_max_size   sga_target。
11g memory_target   memory_max_target     
memory_target设置超过了系统限制(/dev/shm)后,会报ORA-00845。 
增加shm步骤,先umount,再mount
umount  /dev/shm
mount -t tmpfs shmfs -o size=    /dev/shm 


SGA_MAX_SIZE+P_A_T <= 物理内存*80%



捕获存在问题的 SQL 语句
通过如下 getsql.sql 脚本,我们可以获取相关 SQL 语句:

SELECT /*+ ORDERED */ sql_text FROM v$sqltext a
WHERE (a.hash_value, a. address) IN (
SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC;

这里我们涉及了 3 个视图,并应用其关联进行数据获取。
首先需要输入一个 pid,这个pid process id,也就是在 Topps中我们看到的占用资源较多的PID
通过pidv$process.spid相关联我们可以获得Process的相关信息,

进而通过v$process.addr v$session.paddr 相关联,我们就可以获得和 session 相关的所有信息。
再结合 v$sqltext,我们即可获得当前 session 正在执行的 SQL 语句。 通过 v$process 视图,
我们得以把操作系统和数据库关联了起来。





你可能感兴趣的:(深入解析Oracle学习笔记(第五章))