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.
fonte
2015-08-10 15:21:15
come può essere abilitato? –
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
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. –