!
!
!
!
!
!
!
!

White Paper
[06/10/2002]
Comment scotcher une instruction dans le shared pool …
Vous voulez que Oracle ne fasse pas vieillir prématurément une instruction dans le shared pool. Pour ceci, vous voulez la scotcher (piner ;-)) la bas. Lire d’abord http://www.tafora.fr/wp/optisql.doc.html. Si il s’agit d’un package SQL, facile :

Fixer un package


Pinnerbase.sql

Ce petit bout de code est lancé à l’ouverture de la base et fixe dans le shared pool les packages/programmes/fonctions répertoriés.
BEGIN
  sys.dbms_shared_pool.keep('TITAN.BAU');
  sys.dbms_shared_pool.keep('SYS.AUDSES$');
  sys.dbms_shared_pool.keep('SYS.UTL_TCP');
  sys.dbms_shared_pool.keep('SYS.DBMS_LOB');
  sys.dbms_shared_pool.keep('SYS.STANDARD');
  sys.dbms_shared_pool.keep('SYS.UTL_FILE');
  sys.dbms_shared_pool.keep('SYS.UTL_SMTP');
  sys.dbms_shared_pool.keep('CTXSYS.DRIACC');
  sys.dbms_shared_pool.keep('CTXSYS.DRIDDL');
  sys.dbms_shared_pool.keep('CTXSYS.DRIUTL');
  sys.dbms_shared_pool.keep('SYS.DBMS_PIPE');
  sys.dbms_shared_pool.keep('WWWCTX.IMUTIL');
  sys.dbms_shared_pool.keep('XDB.DBMS_XDBZ');
  sys.dbms_shared_pool.keep('CTXSYS.CTX_DDL');
  sys.dbms_shared_pool.keep('CTXSYS.CTX_DOC');
  sys.dbms_shared_pool.keep('CTXSYS.DRIDISP');
  sys.dbms_shared_pool.keep('CTXSYS.DRILIST');
  sys.dbms_shared_pool.keep('CTXSYS.DRIPIPE');
  sys.dbms_shared_pool.keep('OWA.PPROPALCLI');
  sys.dbms_shared_pool.keep('SYS.DBMS_OUTPUT');
  sys.dbms_shared_pool.keep('SYS.DBMS_RANDOM');
  sys.dbms_shared_pool.keep('CTXSYS.CTX_QUERY');
  sys.dbms_shared_pool.keep('SYS.DBMS_UTILITY');
  sys.dbms_shared_pool.keep('SYS.NO_VM_CREATE');
  sys.dbms_shared_pool.keep('CTXSYS.CTX_OUTPUT');
  sys.dbms_shared_pool.keep('OWA.SEQ_PROPALCLI');
  bau.loglog('Trigger DB ouverte: ok');
EXCEPTION
  WHEN OTHERS THEN
  bau.loglog('Trigger DB ouverte: ' || sqlerrm);
END;
/
SHOW ERRORS

Fixer le code rebelle dépisté en pleine production

Si le code est erratique, vous pouvez le dépister avec les instructions simples de type
select disk_reads/(executions+1) drex, buffer_gets/(executions+1) bfex, 
  loads, invalidations,  executions, sql_text 
  from v$sqlarea
  order by loads;
Cette requête vous aide à dépister la requête rebelle (sql_text).
Avec le texte obtenu, faire :
spool tf_shared_pool_scoth.lis
select 'exec dbms_shared_pool.keep(''' || address || ',' || hash_value || ''', ''c'');' 
  || chr(13)||chr(10) || sql_text 
from v$sqlarea
where lower(sql_text) like lower('ma requéte rebelle');
;
spool OFF 
Vous obtiendrez quelque chose de type :
exec dbms_shared_pool.keep('10D77B74,2096552445', 'c');
                                                                                              
pour l’instruction
select count(*) from loco_urls         
Bien évidemment, puisque rebelle, cette instruction devrait être dépistée et fixée après le boot suivant.

Les procédures /rdbms/admin/dbmspool.sql et /rdbms/admin/prvtpool.plb doivent avoir créé le package dbms_shared_pool avant toute fixation.


BUG ?

Si bug 1318267 (voir Metalink), mettre dans init.ora
SQLEXEC_PROGRESSION_COST=0. 
Le paramètre loads (ou invalidations) est toujours énorme ? Envoyez un mail à sos-oracle@tafora.fr


Radu Caulea, TAFORA,
Senior Oracle Consultant


Copyright © 1998-2002 Radu Caulea, TAFORA MAJ 06/11/2006 !
Commentaires et suggestions radu[CHEZ]tafora.fr