您的位置:首页 > 数据库 > Oracle

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

2015-08-11 16:36 441 查看
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 视图,

我们得以把操作系统和数据库关联了起来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: