ORA-04031的傻瓜解決辦法

jss001發表於2009-02-10
資料庫版本: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部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017120/,如需轉載,請註明出處,否則將追究法律責任。

相關文章