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
Postar um comentário