一、什么是Reserved Pool
某些操作(如large packages or PL/SQL)会需要大的连续的请求share pool空间,如果share pool空间不足且碎片化严重,会迫使oracle寻找未使用的share pool中的空闲chunks来满足这种请求的需要,会造成数据库性能下降。oracle为这些请求专门保留了一部分空间,这部分专属空间就叫做Reserved Pool。Reserved Pool分配大chunks效率更高。
如果遇到large allocations(大量分配),oracle会在shared pool中按照下面的步骤分配空间:
<1>从shared pool的非专属部分(unreserved part,也就是reserved pool)分配
<2>从reserved pool部分分配。如果shared pool的非专属部分空间不足,oracle检查reserved pool是否有足够空间。
<3>从内存中分配。如果专属(reserved part)和非专属部分(unreserved part)空间都不足,那么oracle尝试释放足够的内存来分配。然后再重复第1、2步骤。
二、如何修改Reserved Pool尺寸
Reserved Pool的大小由SHARED_POOL_RESERVED_SIZE参数决定。
默认情况下,SHARED_POOL_RESERVED_SIZE=SHARED_POOL_SIZE*5%
官方文档建议,将SHARED_POOL_RESERVED_SIZE设为SHARED_POOL_SIZE的10%。
如果SHARED_POOL_RESERVED_SIZE 大于SHARED_POOL_SIZE的一半,会报错。
如下:
修改前:
SQL> show parameter shared_pool_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 196M
SQL> show parameter shared_pool_reserved_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size big integer 7M
修改:
alter system set shared_pool_reserved_size=100M scope=spfile;
重启
shutdown
startup
SQL> startup
ORA-00093: shared_pool_reserved_size must be between 5000 and 102760448
报错了,shared_pool_reserved_size只能在5000 和 102760448之间
SQL> select 102760448/1024/1024 from dual;
102760448/1024/1024
-------------------
98 <----正好是shared_pool_size 196的一半
三、如何确定shared_pool_reserved_size是否合理
V$SHARED_POOL_RESERVED视图可以帮助我们优化shared_pool_reserved_size参数。
如果系统有充足的内存,增加SGA的目标是V$SHARED_POOL_RESERVED.REQUEST_MISSES值等于0,也就是没有请求丢失;
如果系统内存不充足,那么目标是没有REQUEST_FAILURES(请求失败),或者阻止REQUEST_FAILURES值增大。
如果增加SGA不能达到目的,那么就增大shared_pool_reserved_size。由于shared_pool_reserved_size属于SHARED_POOL_SIZE的一部分,所以SHARED_POOL_SIZE也要增大,增大的值和shared_pool_reserved_size增大的值一致。
1.何时SHARED_POOL_RESERVED_SIZE 太小
V$SHARED_POOL_RESERVED.REQUEST_FAILURES 值大于0并不断增大。
解决办法:同时增大SHARED_POOL_RESERVED_SIZE和SHARED_POOL_SIZE,且增加的值一致。
2.何时SHARED_POOL_RESERVED_SIZE太大
如果满足下面条件,就说明分配了太多内存给reserved list
● V$SHARED_POOL_RESERVED.REQUEST_MISSES等于0或者不再增大;
● V$SHARED_POOL_RESERVED.FREE_SPACE 大于或等于SHARED_POOL_RESERVED_SIZE 的50%。
如何上面两个条件都满足,可以减小SHARED_POOL_RESERVED_SIZE。
注:10gR2官方文档有错误,将FREE_SPACE写成了FREE_MEMORY
FREE_MEMORY is greater than or equal to 50% of SHARED_POOL_RESERVED_SIZE minimum
-
--get SHARED_POOL_RESERVED_SIZE too large or to small
-
select REQUEST_FAILURES,REQUEST_MISSES,
-
FREE_SPACE/(select value from v$parameter
-
where upper(name)='SHARED_POOL_RESERVED_SIZE')*100 as "PCT_%"
-
from V$SHARED_POOL_RESERVED;
3.何时SHARED_POOL_SIZE太小
通过V$SHARED_POOL_RESERVED能看出SHARED_POOL_SIZE是否太小。
V$SHARED_POOL_RESERVED.REQUEST_FAILURES大于0并不断增大,说明SHARED_POOL_SIZE太小了。
如何优化:
如果reserved list可用还有空闲,那么减小SHARED_POOL_RESERVED_SIZE的值即可;
如果reserved list没有空闲了,就增大SHARED_POOL_RESERVED_SIZE的值。
以上根据整理
阅读(4602) | 评论(0) | 转发(0) |