学无止境
分类: Oracle
2013-10-11 14:00:31
并行执行的slave必须要交换数据和信息,才能在一起工作。
所以必须从共享池或大池里分配内存供它们使用。这决定于PARALLEL_AUTOMATIC_TUNING参数的设置。
如果PARALLEL_AUTOMATIC_TUNING = TRUE,将从大池中分配内存,否则从共享池中分配内存。
在这种情况下,自动增大大池,已满足操作。
还有一个隐含参数_PX_use_large_pool也控制了从哪个池中分配内存。
当设置了PARALLEL_AUTOMATIC_TUNING或PARALLEL_MIN_SERVERS参数时,在数据库启动时,会分配一些叫"PX msg pool"的内存,用来避免内存碎片以及更快地获得用于PX缓存的内存。
从10g开始,PARALLEL_AUTOMATIC_TUNING参数以及弃用了,在10g中,只要设置了sga_target,就会从大池中分配内存。
在10g中,如果有以下设置,PX message buffers从大池中分配:
a.) parallel_automatic_tuning = true (不赞成使用)
b.) _PX_use_large_pool = true
c.) 设置sga_target
在11g中,如果有以下设置,PX message buffers从大池中分配:
a.) parallel_automatic_tuning = true (不赞成使用)
b.) _PX_use_large_pool = true
c.) 打开了SGA自动调节,设置sga_target或memory_target
可以通过查询V$SGASTAT视图,监控PX msg buffer的内存分配情况。
从大池中分配的叫"PX msg pool",更大一些;从共享池里分配的叫"PX subheap",更小一些
SQL> select * from v$sgastat where name like 'PX%';
POOL NAME BYTES
------------ -------------------------- ----------
shared pool PX subheap desc 140 <<<
shared pool PX msg pool struct 728
shared pool PX QC deq stats 1476
shared pool PX server deq stats 1476
shared pool PX subheap 174748
shared pool PX QC msg stats 2288
shared pool PX server msg stats 2288
large pool PX msg pool 1074000 <<<
如果设置了PARALLEL_AUTOMATIC_TUNING = FALSE (没有设置sga_target的情况下),共享池不会增加,用户的并行请求将会共享池中分配合适的大小来使用。
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使用内存总数的统计。