#Dica - Limpando um SQL da Shared Pool


A limpeza completa da Shared pool pode ser executada através de um alter system flush shared_pool. Porém algumas vezes, podemos nos deparar com a necessidade de "limpeza" de apenas um comando SQL da Shared Pool e não podemos realizar uma limpeza de toda a Shared Pool, uma vez que este processo ocasionará um impacto significativo se executado em um ambiente produtivo.

A partir da versão 11G,a Oracle introduziu a procedure Purge na package DBMS_SHARED_POOL. Permitindo que seja realizada a limpeza de apenas um SQL. Para execução deste processo, precisaremos identificar o address e o hash_value do processo que iremos limpar.
DBMS_SHARED_POOL.PURGE (
   name    VARCHAR2, 
   flag    CHAR DEFAULT 'P', 
   heaps   NUMBER DEFAULT 1)
O parâmetro name é composto pelo address e hash_value. Já o parâmetro flag deve ser definido como:
P para package/procedure/function, 
T para type, 
R para trigger 
Q sequence e 
C para um SQL ou cursor.

No exemplo abaixo vamos efetuar a limpeza do sql select 1 from dual da shared_pool.
SQL> SELECT ADDRESS, HASH_VALUE, SQL_ID,sql_text FROM V$SQL WHERE sql_id='520mkxqpf15q8';

ADDRESS          HASH_VALUE SQL_ID        SQL_TEXT
---------------- ---------- ------------- ---------------------------------------------
00000003D51EAFF8 2866845384 520mkxqpf15q8 select 1 from dual

SQL> exec DBMS_SHARED_POOL.PURGE ('00000003D51EAFF8,2866845384','C');

PL/SQL procedure successfully completed.

SQL> SELECT ADDRESS, HASH_VALUE, SQL_ID,sql_text FROM V$SQL WHERE sql_id='520mkxqpf15q8';

no rows selected

SQL>
Fonte:
https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_shared_pool.htm#i996877

Comentários