书名书名书名书名书名书名书名书名书名书名书名书名书名书名
672 1.6 100 0 756 1.8 100 0 840 2 100 0 1260 3 100 0 1680 4 100 0 2520 6 100 0 3360 8 100 0 14 rows selected
v$pga_target_advice_histogram 视图可以通过对不同工作区大小的采样评估提供统计信息供分析使用。其中几个重要字段有:
u? LOW_OPTIMAL_SIZE-Histogram评估区间内Optimal下限 (bytes) u? HIGH_OPTIMAL_SIZE-Histogram评估区间内Optimal上限 (bytes)
u? ESTD_OPTIMAL_EXECUTIONS-Histogram评估区间内估计optimal执行次数 u? ESTD_ONEPASS_EXECUTIONS-Histogram评估区间内估计onepass执行次数 u? ESTD_MULTIPASSES_EXECUTIONS-Histogram评估区间内估计multipass执行次数 u? ESTD_TOTAL_EXECUTIONS-Histogram评估区间内估计执行总次数 我们可以从OEM的直观柱状图中得到不同PGA设置下的评估数据:
同样的,这个柱状图表的信息来自动态性能视图v$pga_target_advice_histogram,我们可以从数据库中查询得到这些数据,以上柱状图正是依据这些数据绘制得出的:
SQL> SELECT pga_target_factor factor, low_optimal_size / 1024 low, ·16·
第1章 章名章名章名章名章名
2 ROUND (high_optimal_size / 1024) high,
3 estd_optimal_executions estd_opt, estd_onepass_executions estd_op, 4 estd_multipasses_executions estd_mp, estd_total_executions estd_exec 5 FROM v$pga_target_advice_histogram
6 WHERE pga_target_factor = 0.25 AND estd_total_executions > 0;
FACTOR LOW HIGH ESTD_OPT ESTD_OP ESTD_MP ESTD_EXEC ---------- ---------- ---------- ---------- ---------- ---------- ---------- 0.25 262144 524288 1 0 1 2 0.25 65536 131072 0 0 2 2 0.25 32768 65536 4 2 2 8 0.25 16384 32768 0 2 0 2 0.25 8192 16384 3 1 2 6 0.25 512 1024 2038 0 0 2038 0.25 64 128 3 0 0 3 0.25 2 4 4540 0 0 4540 8 rows selected
PGA的新特性使得PGA的管理得以极大简化。
5.2.7 PGA的转储
对于PGA的进一步研究可以通过转储进程内存结构来实现,Oracle提供如下命令用于将进程内存地址信息转储到跟踪文件:
alter session set events 'immediate trace name heapdump level n'; 其中不同的level级别决定了将哪些内存堆转储到跟踪文件:
Level 1: PGA汇总信息 Level 2: SGA汇总信息 Level 4: UGA汇总信息
Level 8: 当前调用的汇总信息(CGA) Level 16: 用户调用的汇总信息(CGA) Level 32: Large pool的汇总信息(LGA) Level 1025: PGA详细信息 Level 2050: SGA详细信息 Level 5000: UGA 详细信息 Level 8200: 当前调用的详细信息 Level 16400: 用户调用的详细信息 Level 32800: Large pool的详细信息
看一个简单的范例,通过Level 1转储PGA概要信息:
SQL> alter session set events 'immediate trace name heapdump level 1'; Session altered.
·17·
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
检查跟踪文件可以发现和PGA相关的内容:
HEAP DUMP heap name=\ extent sz=0x206c alt=92 het=32767 rec=0 flg=2 opc=2 parent=(nil) owner=(nil) nex=(nil) xsz=0xfff8 EXTENT 0 addr=0xb5f20008
Chunk b5f20010 sz= 18972 perm \ Chunk b5f24a2c sz= 7076 free \
Chunk b5f265d0 sz= 4164 freeable \ Chunk b5f27614 sz= 20568 freeable \ Chunk b5f2c66c sz= 176 freeable \ Chunk b5f2c71c sz= 176 freeable \。。。。。。。。。。。。。。。
Chunk dcd37f0 sz= 220 freeable \ Chunk dcd38cc sz= 1292 freeable \ Chunk dcd3dd8 sz= 260 freeable \
Chunk dcd3edc sz= 4144 freeable \EXTENT 2 addr=0xdcd0e28
Chunk dcd0e30 sz= 4148 freeable \ Chunk dcd1e64 sz= 4144 freeable \EXTENT 3 addr=0xdcced28
Chunk dcced30 sz= 6448 perm \ Chunk dcd0660 sz= 144 free \ Chunk dcd06f0 sz= 28 freeable \ Chunk dcd070c sz= 72 freeable \
Chunk dcd0754 sz= 1600 recreate \ ds dcd00c0 sz= 14036 ct= 4 EXTENT 4 addr=0xdccccb0
Chunk dccccb8 sz= 6292 perm \ Chunk dcce54c sz= 2000 recreate \ ds dcc7a98 sz= 2000 ct= 1 EXTENT 5 addr=0xdcc7c88
Chunk dcc7c90 sz= 20496 perm \EXTENT 6 addr=0xdcc5c10
Chunk dcc5c18 sz= 7224 perm \ Chunk dcc7850 sz= 436 perm \ Chunk dcc7a04 sz= 136 perm \ Chunk dcc7a8c sz= 296 freeable \
进一步的,可以将某个具体的数据存储结构转储出来(DS),如以上的ds dcd00c0其空间使用的大小为 sz= 14036,首先对空间地址进行一下转换:
·18·
第1章 章名章名章名章名章名
SQL> select to_number('dcd00c0','xxxxxxxxxx') from dual; TO_NUMBER('DCD00C0','XXXXXXXXXX') --------------------------------- 231538880
然后在Oracle9iR2之后使用如下命令转储固定地址空间的内容:
alter session set events 'immediate trace name heapdump_addr level 1, addr n'; 以上计算的地址空间可以通过如下命令转储:
SQL> ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level 1, addr 231538880'; Session altered.
其内容如下所示:
HEAP DUMP heap name=\
extent sz=0x1024 alt=32767 het=32767 rec=0 flg=2 opc=2 parent=0xc6a6580 owner=(nil) nex=(nil) xsz=0x1024 EXTENT 0 addr=0xdcd3ee8
Chunk dcd3ef0 sz= 2048 free \ Chunk dcd46f0 sz= 2076 freeable \EXTENT 1 addr=0xdcd0e3c
Chunk dcd0e44 sz= 932 free \ Chunk dcd11e8 sz= 44 freeable \……………………………
Chunk dcd0d5c sz= 56 freeable \Total heap size = 13940 FREE LISTS: Bucket 0 size=0
Chunk dcd3ef0 sz= 2048 free \ Chunk dcd0e44 sz= 932 free \ Chunk dcd1e78 sz= 928 free \ Chunk dcd0778 sz= 444 free \Total free space = 4352
UNPINNED RECREATABLE CHUNKS (lru first): PERMANENT CHUNKS:
Permanent space = 0
5.2.8 转储与PGA分析
通过上一节提到的PGA内存转储技术,可以对PGA的运行原理进行进一步的分析。下面来探讨一下Oracle9i中引入的_use_realfree_heap在PGA管理中的作用。
SQL> connect eygle/eygle Connected.
·19·
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
SQL> select * from v$version where rownum <2; BANNER
---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
SQL> ALTER SESSION SET EVENTS 'immediate trace name heapdump level 1';
Session altered.
SQL> SELECT a.VALUE || b.symbol || c.instance_name || '_ora_' || d.spid || '.trc' trace_file 2 FROM (SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') a,
3 (SELECT SUBSTR (VALUE, -6, 1) symbol FROM v$parameter WHERE NAME = 'user_dump_dest') b, 4 (SELECT instance_name FROM v$instance) c,
5 (SELECT spid FROM v$session s, v$process p, v$mystat m
6 WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d; TRACE_FILE
-------------------------------------------------------------------------------- /opt/oracle/admin/mmstest/udump/mmstest_ora_5669.trc
检查这个进程转储文件,可以发现如下Heap地址信息及空间分配:
[oracle@test oracle]$ grep HEAP /opt/oracle/admin/mmstest/udump/mmstest_ora_5669.trc HEAP DUMP heap name=\HEAP DUMP heap name=\HEAP DUMP heap name=\
根据输出可以看到,在自动管理模式下,PGA,CGA,UGA都是独立分配的。 通过跟踪连接会话,可以获得操作系统上调用执行情况:
[oracle@test oracle]$ strace -p 5669 -o 5669.txt
在SQL*Plus中执行一个简单查询:
SQL> select count(*) from dba_users; COUNT(*) ---------- 16
摘录跟踪文件的主要内容如下:
[oracle@test oracle]$ grep -v get 5669.txt
read(8, \times(NULL) = 32667140 times(NULL) = 32667141 times(NULL) = 32667141 times(NULL) = 32667141 times(NULL) = 32667141
mmap2(NULL, 524288, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE, 7, 0x74) = 0xb5e84000 ·20·