2010-05-27 10 views
4

Je suis nouveau sur DBMS_PROFILER. Tous les exemples que j'ai vus utilisent une simple procédure de niveau supérieur pour démontrer l'utilisation du profileur, et à partir de là obtenir tous les numéros de ligne etc. Je déploie tout le code dans les paquets, et j'ai beaucoup de mal à remplir ma session de profil le plsql_profiler_units avec des données utiles. La plupart de mes courses ressemblent à ceci:Oracle DBMS_PROFILER affiche seulement Anonymous dans les tableaux de résultats

RUNID RUN_COMMENT UNIT_OWNER UNIT_NAME   SECS PERCEN 
----- ----------- ----------- -------------- ------- ------ 
5  Test  <anonymous> <anonymous>  .00 2.1 
     Profiler 

5  Test  <anonymous> <anonymous>  .00 2.1 
     Profiler 

5  Test  <anonymous> <anonymous>  .00 2.1 
     Profiler 

Je viens intégré les appels à la dbms_profiler.start_profiler, flush_data et stop_profiler selon tous les exemples. La principale différence est que mon code est dans un paquet, et appelle dans un autre paquet. Avez-vous besoin de profiler chaque procédure stockée dans votre pile d'appels? Si oui, cela rend cet outil un peu inutile!

J'ai vérifié http://www.dba-oracle.com/t_plsql_dbms_profiler.htm pour des indices, entre autres sites similaires.

+0

Quelle est la version de base de données? Il est possible que si le compilateur d'optimisation fait quelque chose comme du code en ligne, il devient impossible de réconcilier les mesures du code optimisé restructuré avec la source d'origine. –

+0

C'est Oracle 10.2g –

Répondre

4

Etes-vous sûr que ce n'est pas un problème avec votre requête pour récupérer des données de plsql_profiler_units?


J'ai essayé ceci:

Create Procedure sub_procedure As 
Begin 
    dbms_output.put_line('test'); 
End; 

Create Package test_package As 
    Procedure test; 
End; 

Create Package Body test_package As 
    Procedure test As Begin 
    For i In 1 .. 10 Loop 
     If(i<=5) Then 
     sub_procedure; 
     End If; 
    End Loop; 
    End; 
End; 

Begin 
    DBMS_PROFILER.start_profiler(SYSDATE); 
    test_package.test; 
    DBMS_PROFILER.stop_profiler; 
End; 

et cette simple requête

Select uni.unit_name, dat.line#, dat.total_occur 
    From plsql_profiler_data dat 
    Join plsql_profiler_units uni On ( uni.runid = dat.runid 
            And uni.unit_number = dat.unit_number) 

me donne le résultat attendu montrant les paquetages aussi et procédures:

<anonymous> 1 0 
<anonymous> 2 0 
<anonymous> 3 2 
<anonymous> 4 1 
<anonymous> 5 0 
TEST_PACKAGE 2 0 
TEST_PACKAGE 3 11 
TEST_PACKAGE 4 5 
TEST_PACKAGE 5 6 
TEST_PACKAGE 8 1 
SUB_PROCEDURE 1 0 
SUB_PROCEDURE 3 5 
SUB_PROCEDURE 4 5 
+0

Merci pour cela - J'ai couru votre exemple et cela a fonctionné bien. Ensuite, j'ai réexécuté le package qui me causait des problèmes avec SQL * Developer, et il semblait profiler OK. Une chose à laquelle je pensais, c'est que mon commentaire n'était pas unique dans mon premier test - est-ce que ça doit être? L'ajout de l'horodatage semble être un bon moyen de s'en assurer. –

+0

Ok, j'ai toujours le même problème lorsque la procédure stockée est appelée par mon application, mais il profils OK lorsqu'il est appelé à partir de SQL * Developer. L'application se connecte en tant qu'utilisateur différent de celui que j'utilise généralement à partir de SQL * Developer. Existe-t-il des autorisations qui doivent être définies pour que cela fonctionne correctement? –

+0

@Greg Reynolds: Il ne doit pas être unique. Le paramètre 'run_comment' est stocké dans' plsql_profiler_runs.run_comment' et aide à distinguer les différents appels. Connectez-vous à * SQL * Developer * en utilisant le même utilisateur que votre application pour savoir si les subventions sont manquantes. –

Questions connexes