Rechercher sur arkzoyd.com

23 avril 2011

Recherche d'ordres SQL "factorisables" dans Oracle

Juste un rapide commentaire pour indiquer une colonne très utile sur les environnements transactionnels avec le paramètre cursor_sharing=EXACT. Si vous cherchez à détecter des requêtes qui s'éxécuteraient de manière très fréquente avec des valeurs litérales plutôt qu'avec des variables bind, regardez la colonne FORCE_MATCHING_SIGNATURE de la vue V$SQL ; voici une petite démonstration :
select 1 from dual;
select 2 from dual;
select 3 from dual;

col sql_text format a60 
set lines 120
col FORCE_MATCHING_SIGNATURE format 99999999999999999999
select sql_id, 
       force_matching_signature, 
       sql_text  
  from v$sql where regexp_like(sql_text, '([d]ual)$')
  order by 2;

SQL_ID        FORCE_MATCHING_SIGNATURE SQL_TEXT
------------- ------------------------ ----------------------------------
0rnt8v06tb3sp      4921956989962288504 select sysdate + 10/1440 from dual
9fusd37prv595     10559245208183986822 select 2 from dual
1rqd29uzs8ra1     10559245208183986822 select 3 from dual
520mkxqpf15q8     10559245208183986822 select 1 from dual
La valeur de cette colonne est identique pour les ordres qui seraient identique avec la valeur cursor_sharing=FORCE ; un rank() ou un group by et vous pourrez très vite détecter des problèmes (certes très évidents) dans le code. Pour en savoir plus sur cette colonne, jetez un oeil à la documentation de référence.

Aucun commentaire: