oracle shared_pool_size 0,SHARED_POOL_RESERVED_SIZE及RESERVED POOL

本文详细解析了Oracle Shared Pool中的ReservedPool概念,其在处理大内存分配中的作用,以及如何根据V$SHARED_POOL_RESERVED视图调整SHARED_POOL_RESERVED_SIZE。通过实例说明了大小设置的合理范围和优化技巧,适合DBA和性能调优者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是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_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的值。

以上根据整理