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,也就是在 Top或ps中我们看到的占用资源较多的PID。
通过pid和v$process.spid相关联我们可以获得Process的相关信息,
进而通过v$process.addr 和 v$session.paddr 相关联,我们就可以获得和 session 相关的所有信息。
再结合 v$sqltext,我们即可获得当前 session 正在执行的 SQL 语句。 通过 v$process 视图,
我们得以把操作系统和数据库关联了起来。