Lorsqu’on a en shared pool un plan d’exécution mauvais (par exemple à cause de bind variable peeking sur des valeurs particulières) il faut pouvoir vite l’invalider afin que la prochaine exécution fasse un hard parse.
Voici comment invalider directement un cursor avec dbms_shared_pool.purge:
Je récupère le nom à passer à partir du sql_id:
select rawtohex(address)|| ','||to_char(hash_value),sql_id,child_number
from v$sql where sql_id='84vk5fwyw403g';
from v$sql where sql_id='84vk5fwyw403g';
RAWTOHEX(ADDRESS)||’,’||TO_CHAR(HASH_VALUE) | SQL_ID | CHILD_NUMBER |
---|---|---|
000007FF1E4B7218,1036124271 | 84vk5fwyw403g | 0 |
Et j’invalide le curseur:
exec sys.dbms_shared_pool.purge('000007FF1E4B7218,1036124271','...');
Exemple complet ici: demo