天天看點

如何清除某條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%'