dba 日常管理過程中會遇到需要把特定的sql語句的執行計劃從shared pool 中清除或者需要重新生産新的執行計劃的要求。通常的alter system flush shared_pool;或者重新執行資訊統計又會造成較大的影響,是以可以使用oracle提供的
dbms_shared_pool.purge 來清除某個特定的sql的執行計劃。
下面是關于dbms_shared_pool.purge 的官方介紹:
the syntax for the dbms_shared_pool.purge package is:
procedure purge (name varchar2, flag char default 'p', heaps number default 1);
name: 指定要處理的對象的名稱,有兩種情況:
1 pl/sql 對象 就是對象的名稱
2 sql對象,指定 'address','hash_value' 的 sql 遊标。
标記位 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 --遊标
heaps: heaps to purge. e.g if heap 0 and heap 6 are to be purged.
1<<0 | 1<<6 => hex 0x41 => decimal 65. so specify heaps=>65.
default is 1 i.e heap 0 which means the whole object will be purged.
實驗環境 版本:11.2.0.1.0 dbms_shared_pool.purge 隻能通過dba才能使用
sql*plus: release 11.2.0.1.0 production on fri jul 8 15:32:43 2011
table created.
no rows selected
2 from v$sql where sql_text like 'select * from yangtab%';
address hash_value executions parse_calls
---------------- ---------- ---------- -----------
00000001736efbb8 3337951036 1 1
begin dbms_shared_pool.purge('00000001736efbb8,3337951036','c'); end;
*
error at line 1:
ora-06550: line 1, column 7:
pls-00201: identifier 'dbms_shared_pool.purge' must be declared
pl/sql: statement ignored
connected.
2 from v$sql where sql_text like 'select * from yangt%';
00000001736efbb8 3337951036 1 1 -- 使用普通使用者時生成的。
0000000170d9ba50 2693392179 1 1
使用dbms_shared_pool.purge 删除第一個sql的遊标。
pl/sql procedure successfully completed.
2 from v$sql where sql_text like 'select * from yangt%'