共有プール上の特定カーソルを狙い打ちで age out(消去)する。(DBMS_SHARED_POOL.PURGEプロシージャ)
共有プールの特定カーソルを狙い打ちで age out(消去) するには、
DBMS_SHARED_POOLパッケージの PURGEプロシージャ を使用します。
まず V$SQLAREA を 参照して、age out したい SQL の ADDRESS値 と HASH_VALUE値 を確認します。
SQL> SET LINESIZE 170; SQL> SET PAGESIZE 300; SQL> COLUMN SQL_TEXT FORMAT A60 SQL> SQL> SELECT SQL_ID 2 , ADDRESS 3 , HASH_VALUE 4 , SUBSTR(SQL_TEXT, 1, 60) AS SQL_TEXT 5 FROM V$SQLAREA 6 WHERE SQL_ID = '13xsxz67du4xy'; SQL_ID ADDRESS HASH_VALUE SQL_TEXT ------------- ---------------- ---------- ------------------------------------------------------------ 13xsxz67du4xy 0000000081D6EF48 2396853182 SELECT /*+ PARALLEL(4) */ * FROM TBL_X_TARGET ^^^^^^^^^^^^^^^^ ^^^^^^^^^^コレ
上記で確認した ADDRESS と HASH_VALUE を使って、DBMS_SHARED_POOL.PURGEプロシージャを実行します。
flagパラメータは'C'を設定する。CURSOR の C なんだと思う。
SQL> EXEC SYS.DBMS_SHARED_POOL.PURGE('0000000081D6EF48, 2396853182','C'); ^^^^^^^^^^^^^^^^ ^^^^^^^^^^対象SQLの ADDRESS と HASH_VALUE を指定 PL/SQL procedure successfully completed.
改めて V$SQLAREA を確認、バッチリ消えてるZe!(`・ω・)Ъ
SQL> SELECT SQL_ID 2 , ADDRESS 3 , HASH_VALUE 4 , SUBSTR(SQL_TEXT, 1, 60) AS SQL_TEXT 5 FROM V$SQLAREA 6 WHERE SQL_ID = '13xsxz67du4xy'; no rows selected SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id => '13xsxz67du4xy')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------ SQL_ID: 13xsxz67du4xy, child number: 0 cannot be found SQL>
参考マニュアルは下記となります。
Oracle® Database PL/SQLパッケージおよびタイプ・リファレンス 11g リリース2(11.2) B56262-06 133 DBMS_SHARED_POOL PURGEプロシージャ http://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_shared_pool.htm#CHDCBEBB