2015-07-24 12 views
6

E 'possibile in Oracle11g al profilo funzioni memorizzate che vengono richiamati nel codice plsql dall'interno SELECT ... INTO ... affermazione?funzioni Profiling memorizzati in Oracle

Per il profilo, utilizzo l'utilità DBMS_HPROF. Dopo un'esecuzione di profiling nella tabella DBMSHP_FUNCTION_INFO, è possibile visualizzare tutto tranne le funzioni richiamate all'interno di SELECT ... INTO ....

risposta

3

In 11g2, i miei risultati hprof comprendono linee di funzioni del pacchetto che sono chiamati come

SELECT my_pkg.my_func(x) INTO y FROM dual; 

Ora, non vedo ogni linea - di solito solo le istruzioni SQL. Ad esempio, ho profilato "main_test" nel seguente pacchetto.

ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0; 

CREATE OR REPLACE PACKAGE matt_t1 AS 
    FUNCTION p (a NUMBER) 
    RETURN NUMBER; 

    PROCEDURE main_test; 
END matt_t1; 

CREATE OR REPLACE TYPE my_num_tab_type IS TABLE OF NUMBER; 

CREATE OR REPLACE PACKAGE BODY matt_t1 AS 
    FUNCTION p (a NUMBER) 
    RETURN NUMBER IS 
    x NUMBER := 0; 
    t my_num_tab_type; 
    BEGIN 
    t := new my_num_tab_type(); 
     for i in 1..10000 loop 
      x := ln (x+i); 
      t.extend(); 
     t(i) := x; 
    END loop; 

    SELECT SUM(column_value) INTO x FROM TABLE(t); 
    RETURN x; 
    END p; 

    PROCEDURE main_test IS 
    x NUMBER; 
    BEGIN 
    FOR i IN 1 .. 100 LOOP 
     x := matt_t1.p (i); 
     DBMS_OUTPUT.put_line (x); 
    END LOOP; 
    END main_test; 
END matt_t1; 

Nei risultati hprof, vedo le voci per

SELECT SUM(column_value) INTO x FROM TABLE(t); 

Ma non, ad esempio,

x := ln (x+i); 

ottengo gli stessi risultati se io chiamo la funzione p come SELECT INTO vs se assegno un valore direttamente tramite PL/SQL. In entrambi i casi, tutto il tempo per i 10.000 logaritmi naturali è bucketed sotto la voce hprof per la linea

FUNCTION p (a NUMBER) 

ho anche ottenere gli stessi risultati se ho appena profilo un chiamata a MATT_T1.P() direttamente.

Quindi, penso che HPROF possa avere alcune limitazioni sul tipo di linee PL/SQL che può includere, ma mi sembra che il metodo call (SELECT..INTO) non abbia nulla a che fare con esso.

0

Hai provato a abilitare il profiler all'interno della funzione memorizzata? Questo può creare traccia separata (runId diversi).

+0

come può essere abilitato? –

+0

aggiungendo questo al codice funzione dbms_hprof.start_profiling (posizione, nome file, max_depth); e dbms_hprof.stop_profiling .. di nuovo questo è solo per capire cosa sta succedendo .. non so se questo può funzionare per le esigenze in corso del tuo programma. – Brainhash

+0

Non penso sia necessario. HPROF * * include i dati provenienti da chiamate di funzioni interne, anche se la chiamata alla funzione viene chiamata tramite "SELECT f (x) FROM ...". È solo che alcuni tipi di linee PL/SQL (ad es. "X: = X +1") non sono inclusi nell'output HPROF. Ma il metodo di chiamata non ha nulla a che fare con ciò che è incluso o meno. Quindi, l'avvio di una corsa HPROF separata all'interno di ogni chiamata di funzione non fornirà ulteriori dettagli che si stanno già ottenendo dall'esecuzione HPROF di primo livello. –

1

Vedo tutte le funzioni in DBMSHP_FUNCTION_INFO esclusa funzione sql perché Dbms_hprof dosen't trace sql function (come ln, nvl ... ecc.).

create or replace function addNum(p1 number,p2 number) return 
as 
begin 
return p1+p2; 
end; 

BEGIN 
    sys.DBMS_HPROF.START_PROFILING('TMP', 'test.trc'); 
END; 
/

declare 
n number; 
n2 number; 
n3 number; 
BEGIN 
    select sum(1),max(1),ln(1) into n,n2,n3 from dual; 
    select max(addNum(1,level)) into n from dual connect by level<10; 
END; 
/

BEGIN 
    DBMS_HPROF.STOP_PROFILING; 
END; 
/

Quindi inseriamo nel file trc.
select sum(1) into n from dual; è contrassegnato come P#C SQL."".""."__static_sql_exec_line6" #6 quel significa che SQL statico è stato eseguito in linea 6.
select max(addNum(1,level)) into n from dual connect by level<10; ciò selezionate inizia con P#C SQL."".""."__static_sql_exec_line7" #7 inizio nella linea 6 e successiva essa si passa alla plsql VM risultato addnum caclucates. __plsql_vm e ADDNUM appere 9 volte in trc.

P#C SQL."".""."__static_sql_exec_line7" #7 
P#X 3338 
P#C PLSQL."".""."__plsql_vm" <--switch context 
P#X 2 
P#C PLSQL."ALUKASIEWICZ"."ADDNUM"::8."ADDNUM"#a7f835561d3611ed #1 <-- execut function 
+0

Penso che l'OP volesse vedere "return p1 + p2;" linea anche nella traccia.Cioè, voleva che si insinuasse nella funzione addNum() e riferiva come il tempo veniva speso lì. Come ho sottolineato nella mia risposta, il profilo non contiene alcune linee PL/SQL. Le istruzioni SQL sembrano sempre essere incluse, ma è probabile che venga esclusa una semplice "P1 + P2". Ma la sua inclusione o esclusione sembra non avere nulla a che fare con come viene chiamato (direttamente o tramite SELECT AddNum() ..). –