Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2874739
  • 博文数量: 200
  • 博客积分: 2413
  • 博客等级: 大尉
  • 技术积分: 3067
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-01 22:07
文章分类

全部博文(200)

文章存档

2018年(2)

2017年(8)

2016年(35)

2015年(14)

2014年(20)

2013年(24)

2012年(53)

2011年(44)

分类: Oracle

2014-05-08 14:44:29

一、什么是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

  1. --get SHARED_POOL_RESERVED_SIZE too large or to small
  2. select REQUEST_FAILURES,REQUEST_MISSES,
  3.   FREE_SPACE/(select value from v$parameter
  4.  where upper(name)='SHARED_POOL_RESERVED_SIZE')*100 as "PCT_%"
  5. 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的值。


以上根据整理




阅读(4592) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~