Pachetul DBMS_PROFILER oferă dezvoltatorilor o modalitate pentru a determina blocaje de performanță ale aplicațiilor PL/SQL. DBMS_PROFILER permite dezvoltatorilor analiza comportamentului și timpului de funcționare a codului PL/SQL și ajută la identificarea problemelor de performanță oferind „numărul de execuții” și „timpul necesar” pentru fiecare linie din blocul PL/SQL.
DBMS_PROFILER generează următoarele statistici:
– Timpul total scurs de la executarea întregului cod.
– Numărul total al execuțiilor pentru fiecare linie de cod.
– Timpul total petrecut în executarea fiecărei linii de cod.
– Timpul minim/maxim petrecut pentru fiecare linie de cod în execuție.
– Codul executat pentru un anumit scenariu și condiții.
Pachetul DBMS_PROFILER oferă trei proceduri:
– DBMS_PROFILER.START_PROFILER: începe procesul de monitorizare
– DBMS_PROFILER.STOP_PROFILER: oprește procesul de monitorizare
– DBMS_PROFILER.FLUSH_DATA: salvarea statisticilor în tabele și curățarea memoriei.
Dacă utilizați DBMS_PROFILER pentru prima dată, poate fi necesar să-l instalați. Script-urile de instalare se află în „$ORACLE_HOME/RDBMS/admin”.
Cum se instalează pachetul de DBMS_PROFILER:
Instalarea pachetului DBMS_PROFILER este un proces din doi pași.
1. se executa „@$ORACLE_HOME/RDBMS/admin/profload.sql”, cu utilizatorul sys.
2. se executa „@$ORACLE_HOME/RDBMS/admin/proftab.sql” de utilizator pe care doriți să utilizați DBMS_PROFILER.
SQL> conn / as sysdba Connected. SQL> @?/rdbms/admin/profload.sql Package created. Grant succeeded. Synonym created. Library created. Package body created. Testing for correct installation SYS.DBMS_PROFILER successfully loaded. PL/SQL procedure successfully completed.
Pasul 2 va crea următoarele tabele în care vor fi stocate datele de profil, din care putem extrage informațiile pentru a determina blocajele de performanță.
– PLSQL_PROFILER_RUNS
– PLSQL_PROFILER_UNITS
– PLSQL_PROFILER_DATA
SQL> conn scott/tiger Connected. SQL> @?/rdbms/admin/proftab.sql drop table plsql_profiler_data cascade constraints * ERROR at line 1: ORA-00942: table or view does not exist drop table plsql_profiler_units cascade constraints * ERROR at line 1: ORA-00942: table or view does not exist drop table plsql_profiler_runs cascade constraints * ERROR at line 1: ORA-00942: table or view does not exist drop sequence plsql_profiler_runnumber * ERROR at line 1: ORA-02289: sequence does not exist Table created. Comment created. Table created. Comment created. Table created. Comment created. Sequence created.
Pentru a analiza codul PL/SQL și identificarea problemelor de performanță folosind DBMS_PROFILER trebuie să începem mai întâi să pornim profiler-ul folosind DBMS_PROFILER.START_PROFILER, atunci putem executa procedura PL/SQL care va fi monitorizata, iar în cele din urma pentru a opri profiler-ul trebuie sa apelam DBMS_PROFILER.STOP_PROFILER. Nu avem nevoie de a apela DBMS_PROFILER.FLUSH_DATA în mod explicit deoarece DBMS_PROFILER.STOP_PROFILE va apela flush profiler data automat.
Pasul 1: Colectarea datelor
SQL> conn scott/tiger Connected. SQL> exec dbms_profiler.start_profiler('Test profiler'); PL/SQL procedure successfully completed. SQL> declare counter number := 1; 3 executions number; 4 buffer_gets NUMBER; 5 cpu_time number; 6 elapsed_time number; 7 8 error_code number; 9 10 BEGIN 11 for i in 1..10000 loop 12 select count('test_profiler') into counter from dual; 13 end loop; 14 15 select executions,buffer_gets,cpu_time,elapsed_time into executions,buffer_gets,cpu_time,elapsed_time 16 from sys.v_$sqlstats where sql_text like '%test_profiler%FROM DUAL'; 17 18 dbms_output.put_line('exectutions: ' || to_char(executions,'999,999,999')); 19 dbms_output.put_line('buffer gets: ' || to_char(buffer_gets,'999,999,999')); 20 dbms_output.put_line('cpu time: ' || to_char(cpu_time,'999,999,999')); 21 dbms_output.put_line('elapsed time: ' || to_char(elapsed_time,'999,999,999')); 22 dbms_output.put_line('elapsed time per execution(ms) : ' ||to_char( elapsed_time/executions/1000,'999,999.9')); 23 dbms_output.put_line('buffer_gets/second: ' ||to_char( buffer_gets/(elapsed_time/1000000),'999,999,999')); 24 25 END; 26 / PL/SQL procedure successfully completed. SQL> exec dbms_profiler.stop_profiler; PL/SQL procedure successfully completed.
Pasul 2. Identificarea RUNID folosind PLSQL_PROFILER_RUNS
SQL> select runid, run_owner, run_date, run_total_time 2 from plsql_profiler_runs where run_comment='Test profiler'; RUNID RUN_OWNER RUN_DATE RUN_TOTAL_TIME ---------- -------------------------------- --------- -------------- 1 SCOTT 23-OCT-13 3.7790E+10
Pasul 3. Identificarea liniilor problematice PL/SQL cu ajutorul datelor din PLSQL_PROFILER_DATA
SQL> select unit_number,line#, total_occur, total_time, min_time, max_time 2 from plsql_profiler_data order by total_time desc,unit_number; UNIT_NUMBER LINE# TOTAL_OCCUR TOTAL_TIME MIN_TIME MAX_TIME ----------- ---------- ----------- ---------- ---------- ---------- 2 12 10000 390506914 34994 768885 2 15 1 50254524 50254524 50254524 2 11 10001 2809582 0 77988 2 18 1 225966 999 224966 3 1 2 93986 1999 89986 2 22 1 6998 6998 6998 2 19 1 6998 6998 6998 2 1 0 4999 4999 4999 2 21 1 1999 1999 1999 2 2 1 1999 1999 1999 2 20 1 1999 1999 1999 2 23 1 1999 1999 1999 2 25 1 1999 1999 1999