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%'