天天看点

如何清除某条SQL在库缓存中的执行计划

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