--*************************************************
-- 共享池中保留池的调整(shared_pool_reserved_size)
--*************************************************
1.何谓保留池
简言之,保留一部分内存空间以备不时之需。通常情况下,Oracle会将大的内存请求分割成小的内存块来满足需求。而对于大的内
存且为连续的内存空间请求,如果在共享池中未找到,则会动用共享池中的保留池。当然,共享池在内存压力的情况下,也会使用到
保留池中的部分。保留池部分满足较大的内存需求更高效。缺省情况下,Oracle会配置较小的保留池,这部分可以用作PL/SQL或触发器
编译使用或用于装载JAVA对象的临时空间。这些分配出去的内存一旦释放后将返回给保留池。
任意大于"_shared_pool_reserved_min_alloc = 4400" 字节的连续内存分配请求,如果shared_pool中分配不能解决,且当前
shared_pool中没有可用的块能够aged out,则保留池将被使用。
2.大值对象在共享池中分配空间的顺序
a.从共享池中非保留池寻找可用空间
b.如果共享池中非保留池没有所需的可用空间,则从保留池进行分配
c.如果共享池非保留池与保留池都没有所需的空间,则一些对象需要按LRU原则aged out,然后再按a,b步骤来进行分配。
共享池的中的保留池大小不能超过共享池的50%,一般情况下建议为共享池的5%到10%。
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Solaris: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
SQL> show parameter reserved
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
_shared_pool_reserved_pct integer 10
shared_pool_reserved_size big integer 512M --修改该参数来设置保留池的大小
3.保留池的视图
v$shared_pool_reserved
SELECT * from v$shared_pool_reserved;
SQL> desc v$shared_pool_reserved;
Name Null? Type
------------------------------ -------- ----------------------------
--以下字段只有当参数SHARED_POOL_RESERVED_SIZE设置了才有效
FREE_SPACE NUMBER -->保留区的空闲空间数
AVG_FREE_SIZE NUMBER -->保留区的空闲空间平均数
FREE_COUNT NUMBER -->保留区的空闲内存块数
MAX_FREE_SIZE NUMBER -->最大的保留区空闲空间数
USED_SPACE NUMBER -->保留区使用空间数
AVG_USED_SIZE NUMBER -->保留区使用空间平均数。
USED_COUNT NUMBER -->保留区使用内存块数
MAX_USED_SIZE NUMBER -->最大保留区使用空间数
REQUESTS NUMBER -->请求在保留区查找空闲内存块的次数
REQUEST_MISSES NUMBER -->无法满足查找保留区空闲内存块请求,需要从LRU列表中清出对象的次数
LAST_MISS_SIZE NUMBER -->请求的内存大小,这次请求是最后一次需要从LRU列表清出对象来满足的请求
MAX_MISS_SIZE NUMBER -->所有需要从LRU列表清出对象来满足的请求中的内存最大大小
--以下字段无论参数SHARED_POOL_RESERVED_SIZE是否设置了都有效
REQUEST_FAILURES NUMBER -->没有内存能满足的请求次数(导致4031错误的请求)
LAST_FAILURE_SIZE NUMBER -->没有内存能满足的请求所需的内存大小(导致4031错误的请求)
ABORTED_REQUEST_THRESHOLD NUMBER -->不清出对象的情况下,导致4031错误的最小请求大小
ABORTED_REQUESTS NUMBER -->不清出对象的情况下,导致4031错误的请求次数
LAST_ABORTED_SIZE NUMBER -->不清出对象的情况下,最后一次导致4031错误的请求大小
--我们可以根据后面4个字段值来决定如何设置保留区的大小以避免4031错误的发生
SQL> select requests,request_misses,request_failures,last_failure_size,aborted_request_threshold ab_re_th,
2 aborted_requests,last_aborted_size lst_ab_sz
3 from v$shared_pool_reserved;
REQUESTS REQUEST_MISSES REQUEST_FAILURES LAST_FAILURE_SIZE AB_RE_TH ABORTED_REQUESTS LST_AB_SZ
---------- -------------- ---------------- ----------------- ---------- ---------------- ----------
1 0 542 4112 2147483647 0 0
4.保留池调整策略
a.根据视图v$shared_pool_reserved 来查看保留池是否够用
SQL> select free_space,free_count,used_space,avg_used_size from v$shared_pool_reserved;
FREE_SPACE FREE_COUNT USED_SPACE AVG_USED_SIZE
---------- ---------- ---------- -------------
505926544 347 14618016 5826.23196
b.使用包dbms_shared_pool 的过程aborted_request_threshold 来调整阙值
c.修改参数shared_pool_reserved_size
alter system set shared_pool_reserved_size=integer [K | M | G]
如果shared_pool_reserved_size参数值设置的太小,则视图v$shared_pool_reserved中request_failures的值将大于零并且
会持续增加,即导致请求内存失败的次数会增加,解决的办法是增加保留池的大小,相应的增大共享池的大小。
当共享池shared_pool_size太小时,视图v$shared_pool_reserved同样也可以表明参数shared_pool_size值设置的过小。即
视图v$shared_pool_reserved中request_failures次数大于零或持续增加。
如果设定了保留池,shared_pool_size不能够增加的情况下,则可以减少shared_pool_reserved_size的大小。
如果未设定保留池,而request_failures次数大于零或持续增加,则增加共享池的大小。
d.保留池过大
下列两种情况存在,保留池可能过大
request_misses列值始终为零,且没有持续增加
free_memory列值大于等于保留池的50%
e.下面的表用于判断如何调整保留池的空间
IF Request_failures Conjuction Condition Action
------------------- ---------- ---------------- --------------
>0 and increasing AND Request_misses>0 Increase shared_pool_reserved_size
>0 and increasing AND Free_memory>=50% of shared_pool_reserved_size Increase shared_pool_size
=0 OR Free_memory>=50% of shared_pool_reserved_size Decrease shared_pool_reserved_size
5.影响保留池的几个重要参数
col ksppinm format a54
col ksppstvl format a54
SELECT KSPPINM, KSPPSTVL
FROM X$KSPPI PI, X$KSPPCV CV
WHERE CV.INDX = PI.INDX
AND PI.KSPPINM LIKE '/_%' ESCAPE '/' -- '--
AND PI.KSPPINM LIKE '%&Para%';
KSPPINM KSPPSTVL
------------------------------------------------------ ------------------------------------------------------
_shared_pool_reserved_pct 10
_shared_pool_reserved_min_alloc 4400
SQL> show parameter reserved
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
_shared_pool_reserved_pct integer 10
shared_pool_reserved_size big integer 512M
6. 快捷参考
有关性能优化请参考
有关ORACLE体系结构请参考
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 实例和Oracle数据库(Oracle体系结构)
有关闪回特性请参考
Oracle 闪回特性(FLASHBACK DATABASE)
Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
Oracle 闪回特性(Flashback Query、Flashback Table)
Oracle 闪回特性(Flashback Version、Flashback Transaction)
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
有关RMAN的备份恢复与管理请参考
RMAN 备份路径困惑(使用plus archivelog时)
有关ORACLE故障请参考
对参数FAST_START_MTTR_TARGET = 0 的误解及设定
有关ASM请参考
有关SQL/PLSQL请参考
SQL 基础--> 集合运算(UNION 与UNION ALL)
SQL 基础--> 层次化查询(START BY ... CONNECT BY PRIOR)
SQL 基础--> ROLLUP与CUBE运算符实现数据汇总
有关ORACLE其它特性
使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例
日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING)
使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)
簇表及簇表管理(Index clustered tables)
ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAME
Oracle 补丁全集 (Oracle 9i 10g 11g Path)