ITPub博客

首页 > 数据库 > Oracle > ORA-04031的傻瓜解决办法

ORA-04031的傻瓜解决办法

原创 Oracle 作者:jss001 时间:2009-02-10 13:52:12 0 删除 编辑
数据库版本:8.1.6.0
操作系统:WINDOWS 2000 SERVER

应用过程中总是出现ORA-04031错误,采用该方法后运行2个月没有再次出现过该错误。

可以提交一个JOB来自动运行这个过程。

可以将存储过程先钉在缓冲区中。但是现在还不知道如何将字典缓冲区的内容也钉起来,望各位大侠告之:)

create or replace procedure AUTO_PIN is
address varchar2(20); --sql_address
hashvalue varchar2(20); --sql_hashvalue

SumMemory number; --SQL缓冲区总空间
PinMemory number; --钉在SQL缓冲区的空间

cursor cSele_SQL is --查询执行过100次的SQL
select t.ADDRESS,t.HASH_VALUE
from v$sql t
where t.KEPT_VERSIONS=0
and t.EXECUTIONS>100
order by t.EXECUTIONS desc;
begin
select nvl(sum(t.SHARABLE_MEM),0) --查询钉住的SQL所占空间
into PinMemory
from v$sql t
where t.KEPT_VERSIONS<>0;

select sum(t.SHARABLE_MEM) --查询总空间
into SumMemory
from v$sql t;

if PinMemory/SumMemory<0.7 then --小于70%
open cSele_SQL;
fetch cSele_SQL into address,hashvalue;

while cSele_SQL%found loop
-- dbms_output.put_line(address||','||hashvalue);

sys.dbms_shared_pool.keep(address||','||hashvalue,'C'); --钉SQL

fetch cSele_SQL into address,hashvalue;
end loop;
close cSele_SQL;
else --大于70%
execute immediate 'alter system flush shared_pool'; --刷新SHARED_POOL
end if;
end AUTO_PIN;
[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18921899/viewspace-1017120/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    306
  • 访问量
    871796