28
Profiling PLSQL Vijayaragavan R

ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Embed Size (px)

Citation preview

Page 1: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Profiling  PLSQL  

Vijayaragavan  R  

Page 2: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

DBMS_TRACE •  helps to start and stop plsql tracing in a

session •  Steps involved are: –  1. Start - dbms_trace.set_plsql_trace procedure –  2. running the application code –  3. stop - dbms_trace.clear_plsql_trace procedure

Page 3: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Initial Setup •  script to run : tracetab.sql •  Path: $ORACLE_HOME/rdbms/admin/ •  Tables created:

1. plsql_trace_runs 2. plsql_trace_events

 

Page 4: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Grants CREATE PUBLIC SYNONYM plsql_trace_runs FOR

plsql_trace_runs; CREATE PUBLIC SYNONYM plsql_trace_events FOR

plsql_trace_events; CREATE PUBLIC SYNONYM plsql_trace_runnumber

FOR plsql_trace_runnumber; GRANT SELECT, INSERT, UPDATE, DELETE ON

plsql_trace_runs TO PUBLIC; GRANT SELECT, INSERT, UPDATE, DELETE ON

plsql_trace_events TO PUBLIC;

Page 5: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Example

Calc_days.sql: create or replace procedure calc_days (v_date in date) is l_num_days number; begin l_num_days := trunc(sysdate- v_date ); dbms_output.put_line('Number of days :' || l_num_days); dbms_output.put_line('Number of months :' || l_num_days

*12/365) ; dbms_output.put_line('Number of years : ' || l_num_days /365); end;

Page 6: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Trace Enable  alter session set set plsql_debug=TRUE; or alter procedure calc_days compile debug;

Page 7: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Sample Execution  begin dbms_trace.set_plsql_trace (dbms_trace.trace_all_lines); dbms_output.put_line ('Trace started'); calc_days(sysdate-10000); dbms_output.put_line('To stop trace'); dbms_trace.clear_plsql_trace; dbms_trace.set_plsql_trace (dbms_trace.trace_enabled_lines); dbms_output.put_line ('Trace started'); calc_days(sysdate-10000); dbms_output.put_line('To stop trace'); dbms_trace.clear_plsql_trace; end;

Page 8: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Trace  Analysis  Run id: select runid, run_owner , run_date from

plsql_trace_runs order by runid; Trace data analysis: SELECT e.runid,e.event_seq,TO_CHAR(e.event_time,

'DD-MON-YYYY HH24:MI:SS') AS event_time,e.event_unit_owner,e.event_unit,e.event_unit_kind,e.proc_line,e.event_comment FROM plsql_trace_events e WHERE e.runid = 1 ORDER BY e.runid, e.event_seq;

 

Page 9: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

More about Trace Trace Control TRACE_PAUSE TRACE_RESUME Tracing Levels: Ø for all calls or only for enabled calls, Ø for all exceptions or only for enabled

exceptions Ø for all sqls or only for enabled sql Ø for all lines or only for enabled lines.

Page 10: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

DBMS_PROFILER •  To collect profiling data of plsql program

units for performance improvement •  Initial setup – proftab.sql in $ORACLE_HOME/rdbms/

admin – Tables created:

•  plsql_profiler_data •  plsql_profiler_units •  plsql_profiler_runs

Page 11: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Grants: CREATE PUBLIC SYNONYM plsql_profiler_runs FOR

plsql_profiler_runs; CREATE PUBLIC SYNONYM plsql_profiler_units FOR

plsql_profiler_units; CREATE PUBLIC SYNONYM plsql_profiler_data FOR

plsql_profiler_data; CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR

plsql_profiler_runnumber; GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC; GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_data

TO PUBLIC; GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_units

TO PUBLIC; GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_runs

TO PUBLIC;  

Page 12: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Steps

•    Start the profiling session using dbms_profiler.start_profiling

•  Run the plsql unit to be profiled •  Stop the profiling session using

dbms_profiler.stop_profiling

Page 13: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Example:  Annual_sal.sql

create or replace procedure annual_salary as l_annual_salary NUMBER; begin for i in ( select employee_id, salary from employees) loop l_annual_salary := i.salary * 12; end loop; end annual_salary;

Page 14: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Sample Execution  DECLARE l_result BINARY_INTEGER; BEGIN l_result := DBMS_PROFILER.start_profiler(run_comment =>

'annual_salary' ); annual_salary; l_result := DBMS_PROFILER.stop_profiler; END;    

Page 15: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Run id SELECT runid, run_date, run_comment, run_total_time FROM

plsql_profiler_runs where run_comment = 'annual_salary' ORDER BY runid;

Page 16: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Analyse SELECT u.runid, u.unit_number, u.unit_type,

u.unit_owner, u.unit_name, d.line#, d.total_occur, d.total_time, d.min_time, d.max_time

FROM plsql_profiler_units u JOIN plsql_profiler_data d ON u.runid = d.runid

AND u.unit_number = d.unit_number WHERE u.runid = <insert RUNID here> ORDER BY

u.unit_number, d.line#;  

Page 17: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

DBMS_HPROF

•  11g Feature •  dynamic execution profile of the plsql

program organized by subprogram calls •  considers plsql and sql calls separately  

Page 18: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Initial setup •  dbmshptab.sql •  $ORACLE_HOME/rdbms/admin •  tables created:

•  dbmshp_function_info •  dbmshp_parent_child_info •  dbmshp_runs

Page 19: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Grants

GRANT EXECUTE ON dbms_hprof TO HR; CREATE DIRECTORY PLSQL_HPROF AS '/home/oracle/plsql_hprof'; GRANT ALL ON DIRECTORY PLSQL_HPROF TO HR;

Page 20: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Example Hprof1.sql  

 Create or replace procedure hprof1 is Begin Calc_days(sysdate - 1000); End;

Page 21: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Sample Profiling Run:  begin

dbms_hprof.start_profiling( location => 'PLSQL_HPROF', filename=>'Run1.trc'); hprof1; dbms_hprof.stop_profiling; end;

Page 22: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Raw profiler output P#V PLSHPROF Internal Version 1.0 P#! PL/SQL Timer Started P#C PLSQL."HR"."CALC_DAYS"::7."CALC_DAYS"#c0e1380d4054eb50 #1 P#X 191 P#C PLSQL."SYS"."DBMS_OUTPUT"::11."PUT_LINE"#5892e4d73b579470 #109 P#X 2 P#R P#X 6 P#C PLSQL."SYS"."DBMS_OUTPUT"::11."PUT_LINE"#5892e4d73b579470 #109 P#X 1 P#R P#X 5 P#C PLSQL."SYS"."DBMS_OUTPUT"::11."PUT_LINE"#5892e4d73b579470 #109 P#X 1

Page 23: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Run id

SELECT runid, run_timestamp,total_elapsed_time,run_comment FROM dbmshp_runs ORDER BY runid;

Page 24: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Analyse declare

runid number; begin runid := dbms_hprof.analyze(location=> 'PLSQL_HPROF' , filename=> 'Run1.trc'); dbms_output.put_line(' Run ID = ' ||runid); end;

 

Page 25: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Symbol id

SELECT  symbolid,  owner,  module,  type,  funcGon  FROM  dbmshp_funcGon_info  WHERE  runid  =  1  ORDER  BY  symbolid;  

Page 26: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

Heirarchical Info SELECT RPAD(' ', level*2, ' ') || fi.owner || '.'

|| fi.module AS name, fi.function, pci.subtree_elapsed_time, pci.function_elapsed_time, pci.calls FROM dbmshp_parent_child_info pci JOIN dbmshp_function_info fi ON pci.runid = fi.runid AND pci.childsymid = fi.symbolid WHERE pci.runid = 1

CONNECT BY PRIOR childsymid = parentsymid START WITH pci.parentsymid = 2;

Page 27: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

PLSHPROF utility

$plshprof -output run1 run1.trc $plshprof –output diff <Trace_file1>

<Trace_File2>

Page 28: ProfilingPLSQL) - aioug.org · • To collect profiling data of plsql program units for performance ... UPDATE, DELETE ON plsql_profiler_units TO PUBLIC; GRANT SELECT, INSERT, UPDATE,

                   

     Thank you !