并行执行slave需要交换数据和消息以便同时工作。我们必须从共享池或大池中来分配内存。这依赖于PARALLEL_AUTOMATIC_TUNING的设置。
如果PARALLEL_AUTOMATIC_TUNING = TRUE,则我们从大池中分配内存,否则使用的是共享池。在这种情况下,我们动态增加大池的大小,使之足够大。
在数据库的启动阶段,我们分配一些内存给"PX msg pool",当PARALLEL_AUTOMATIC_TUNING or PARALLEL_MIN_SERVERS已设置时,通过这种方式能够避免分片以及获得PX缓冲区的快速内存访问。
当查询V$SGASTAT寻找"PX msg pool"时,可以监控哪些区域分配内存给PX msg buffer。
PX msg buffer可能变得非常大,共享池中我们分配内存给PX操作的另一个区域是 "PX subheap"。
当我们使之与"PX msg pool"比较时,堆是很小的,并且总在共享池中。
SQL> select * from v$sgastat;
POOL NAME BYTES
----------- -------------------------- ----------
fixed_sga 453632
log_buffer 656384
shared pool enqueue 179220
..
shared pool PX subheap 167104 <<<
..
shared pool event statistics per sess 1889720
shared pool fixed allocation callback 184
large pool PX msg pool 2949120 <<<<
large pool free memory 5439488
java pool free memory 25165824
如果PARALLEL_AUTOMATIC_TUNING = FALSE,共享池的大小不会增加,用户需要为共享池选择一个合适的大小。
PX msg 的大小也依赖于参数PARALLEL_EXECUTION_MESSAGE_SIZE和并行度。
执行以下查询以获得更多的内存使用情况统计:
SELECT * FROM V$PX_PROCESS_SYSSTAT WHERE STATISTIC LIKE 'Buffers%';
输出应该类似于以下结果:
STATISTIC VALUE
------------------- -----
Buffers Allocated 23225
Buffers Freed 23225
Buffers Current 0
Buffers HWM 3620
4 Rows selected.
内存使用量出现在Buffers Current 和 Buffers HWM,通过将buffers的数量和PARALLEL_EXECUTION_MESSAGE_SIZE的值相乘得到一个以字节为单位的值。
这个公式并不是100%的正确,为避免大池/共享池的分片,我们分配了大块。这意味着'PX msg pool'的大小要大于'Buffers HWM' * PARALLEL_EXECUTION_MESSAGE_SIZE。
建议:
当遇到ORA-4031并且已设置PARALLEL_AUTOMATIC_TUNING = FALSE,那么考虑将其值设为true,从而Oracle能够调整大池。
已经设置PARALLEL_AUTOMATIC_TUNING = TRUE,那么增加大池。
在以上两种情况下,都请检查PARALLEL_EXECUTION_MESSAGE_SIZE的值。
该贴被oracle_ztj编辑于2012-6-4 16:35:17