ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

共有プール上の特定カーソルを狙い打ちで 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