oracle优化------缓存对象与数据(三)

2014-11-24 08:33:57 ? 作者: ? 浏览: 2
rom v$sysstat where name = parse count (hard) ),
( select value sess from v$sysstat where name = session cursor cache hits );

如果返回SESSION_CACHED_CURSORS缓冲区的使用率是100%,那么说明SESSION_CACHED_CURSORS参数还不够大,如果共享池的大小足够,可以调整该参数,直到使用率低于100%为止。

对于没有使用绑定变量的系统,如果CURSOR_SHARING设置为EXACT的时候,如果设置SESSION_CACHED_CURSORS的时候要十分注意,由于应用原因,CURSOR的重用率十分低,如果设置过高的SESSION_CACHED_CURSORS,会导致共享池空间被大量占用,在系统负载较高的时候会出现共享池的性能问题。

B。保留大型对象

加载大型对象是造成共享池碎片的主要原因;由于大量的小型对象需要从共享池释放以腾出空间,会影响响应时间
为了避免这样情况发生,我们就把大型的,经常使用的对象keep在共享池中,哪些对象需要keep呢?


1)经常用到的大型对象,如standard等程序包,使用共享内存超过阀值的对象
2)经常在常用表中执行的触发器
3)序列,因为当序列从共享池中释放时,序列号就丢失了

使用命令 alter system flush shared_pool命令刷新共享池,但不刷新保留对象

例如用下面的sql查出长度大于500个字符,共享内存大于10000个字节的对象

select *
from v$db_object_cache oc
where length(oc.NAME) > 500
and oc.TYPE in (PACKAGE, PROCEDURE, FUNCTION, PACKAGE BODY)
and oc.KEPT=NO
and oc.SHARABLE_MEM>10000


查看长度超过500字符,共享内存大于20000个字节的匿名pl/sql

select *
from v$sqlarea sq
where sq.COMMAND_TYPE = 47
and length(sq.SQL_TEXT) > 500
and sq.SHARABLE_MEM>20000


把这些对象要keep在共享池中要用dbms_shared_pool.keep,系统默认是没有安装这个包的,需要运行dbmspool.sql这个脚本


SYS@skatedb>@/home/oracle/10.2.0/db_1/rdbms/admin/dbmspool.sql

Package created.


Grant succeeded.


View created.


Package body created.

SYS@skatedb >


SQL> desc dbms_shared_pool
Element Type
------------------------- ---------
SIZES PROCEDURE
KEEP PROCEDURE
UNKEEP PROCEDURE
ABORTED_REQUEST_THRESHOLD PROCEDURE

SQL> desc dbms_shared_pool.keep
Parameter Type Mode Default
--------- -------- ---- --------
NAME VARCHAR2 IN
FLAG CHAR IN Y

SQL> desc dbms_shared_pool.unkeep
Parameter Type Mode Default
--------- -------- ---- --------
NAME VARCHAR2 IN
FLAG CHAR IN Y

ABORTED_REQUEST_THRESHOLD(threshold_size NUMBER): 这个方法可以设定一个界限,保证如果要进入SHARED POOL的对象太大,那么可以设置一个阀值,超过这个阀值的直接报错,而不是经过LRU查找和内存交换之后发现SHARED POOL不够了再报错,可以防
止超大对象过度占用SHARED POOL空间。

UNKEEP 就是KEEP 的反操作

SIZES (minsize NUMBER): 这个是列出SHARED POOL中所有大于minsize的对象,对于查找SHARED POOL中大对象并设置合理
的ABORTED_REQUEST_THRESHOLD很有用。

说明 flag:


Value Kind of Object to keep
-- ----- ----------------------
-- P package/procedure/function
-- Q sequence
-- R trigger
-- T type
-- JS java source
-- JC java class
-- JR java resource
-- JD java shared data
-- C cursor

如果这个flag是空,那么他的默认值是P

保留package


sql> exec dbms_shared_pool.keep(package_name,P);

保留squence(避免sequence跳号)


sql> exec dbms_shared_pool.keep(sequence_name,Q);

保留匿名块


SQL> select address,hash_value
2 from v$sqlarea sq
3 where sq.COMMAND_TYPE = 47
4 and length(sq.SQL_TEXT) > 500
5 and sq.SHARABLE_MEM>20000
6 ;

ADDRESS HASH_VALUE
---------------- ----------
00000000A78655E8 1599878706

sql> exec dbms_shared_pool.keep(address,hash_value,C);

注意:查看47是什么命令
SQL> select * from audit_actions where action=47;

ACTION NAME
---------- ----------------------------
47 PL/SQL EXECUTE


eg:

查看需要keep的匿名块

SQL> select address,hash_value
2 from v$sqlarea sq
3 where sq.COMMAND_TYPE = 47
4 and

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: