此工具是tom编写的工具,用来评估sql的消耗
创建:
1授权
grant SELECT on SYS.v_$statname to "SCOTT" ; grant SELECT on SYS.v_$mystat to "SCOTT" ; grant SELECT on SYS.v_$latch to "SCOTT" ; grant SELECT on SYS.v_$timer to "SCOTT" ; grant create view to scott;2创建视图
--在scott账户下创建视图 create or replace view stats as select 'STAT...' || a.name name, b.value from SYS.v_$statname a, SYS.v_$mystat b where a.statistic# = b.statistic# union all select 'LATCH.' || name, gets from SYS.v_$latch union all select 'STAT...Elapsed Time', hsecs from SYS.v_$timer;3创建信息表
--创建信息收集表 create global temporary table run_stats ( runid varchar2(15), name varchar2(80), value int ) on commit preserve rows;4创建包
--创建包 create or replace package runstats_pkg as procedure rs_start; procedure rs_middle; procedure rs_stop( p_difference_threshold in number default 0 ); end; /5创建包体
--创建包体 create or replace package body runstats_pkg as g_start number; g_run1 number; g_run2 number; procedure rs_start is begin delete from run_stats; insert into run_stats select 'before', stats.* from stats; g_start := dbms_utility.get_cpu_time; end; procedure rs_middle is begin g_run1 := (dbms_utility.get_cpu_time-g_start); insert into run_stats select 'after 1', stats.* from stats; g_start := dbms_utility.get_cpu_time; end; procedure rs_stop(p_difference_threshold in number default 0) is begin g_run2 := (dbms_utility.get_cpu_time-g_start); dbms_output.put_line ( 'Run1 ran in ' || g_run1 || ' cpu hsecs' ); dbms_output.put_line ( 'Run2 ran in ' || g_run2 || ' cpu hsecs' ); if ( g_run2 <> 0 ) then dbms_output.put_line ( 'run 1 ran in ' || round(g_run1/g_run2*100,2) || '% of the time' ); end if; dbms_output.put_line( chr(9) ); insert into run_stats select 'after 2', stats.* from stats; dbms_output.put_line ( rpad( 'Name', 30 ) || lpad( 'Run1', 12 ) || lpad( 'Run2', 12 ) || lpad( 'Diff', 12 ) ); for x in ( select rpad( a.name, 30 ) || to_char( b.value-a.value, '999,999,999' ) || to_char( c.value-b.value, '999,999,999' ) || to_char( ( (c.value-b.value)-(b.value-a.value)), '999,999,999' ) data from run_stats a, run_stats b, run_stats c where a.name = b.name and b.name = c.name and a.runid = 'before' and b.runid = 'after 1' and c.runid = 'after 2' and abs( (c.value-b.value) - (b.value-a.value) ) > p_difference_threshold order by abs( (c.value-b.value)-(b.value-a.value)) ) loop dbms_output.put_line( x.data ); end loop; dbms_output.put_line( chr(9) ); dbms_output.put_line ( 'Run1 latches total versus runs -- difference and pct' ); dbms_output.put_line ( lpad( 'Run1', 12 ) || lpad( 'Run2', 12 ) || lpad( 'Diff', 12 ) || lpad( 'Pct', 10 ) ); for x in ( select to_char( run1, '999,999,999' ) || to_char( run2, '999,999,999' ) || to_char( diff, '999,999,999' ) || to_char( round( run1/decode( run2, 0, to_number(0), run2) *100,2 ), '99,999.99' ) || '%' data from ( select sum(b.value-a.value) run1, sum(c.value-b.value) run2, sum( (c.value-b.value)-(b.value-a.value)) diff from run_stats a, run_stats b, run_stats c where a.name = b.name and b.name = c.name and a.runid = 'before' and b.runid = 'after 1' and c.runid = 'after 2' and a.name like 'LATCH%' ) ) loop dbms_output.put_line( x.data ); end loop; end; end; /使用:
执行runstats中的方法以及两个存储过程
SQL> set serverout on SQL> exec dbms_output.put_line('ok');
SQL> exec runstats_pkg.rs_start;
PL/SQL procedure successfully completed
SQL> select * from emp where empno='7369';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
SQL> exec runstats_pkg.rs_middle;
PL/SQL procedure successfully completed
SQL> select /*+ full(e)*/ * from emp e where e.empno='7369';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
SQL> exec runstats_pkg.rs_stop(10000);
Run1 ran in 1 cpu hsecs
Run2 ran in 1 cpu hsecs
run 1 ran in 100% of the time
Name Run1 Run2 Diff
STAT...session pga memory 65,536 0 -65,536
STAT...logical read bytes from 376,832 516,096 139,264
Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
2,720 6,631 3,911 41.02%
PL/SQL procedure successfully completed
PL/SQL procedure successfully completed
SQL> select * from emp where empno='7369';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
SQL> exec runstats_pkg.rs_middle;
PL/SQL procedure successfully completed
SQL> select /*+ full(e)*/ * from emp e where e.empno='7369';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
SQL> exec runstats_pkg.rs_stop(10000);
Run1 ran in 1 cpu hsecs
Run2 ran in 1 cpu hsecs
run 1 ran in 100% of the time
Name Run1 Run2 Diff
STAT...session pga memory 65,536 0 -65,536
STAT...logical read bytes from 376,832 516,096 139,264
Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
2,720 6,631 3,911 41.02%
PL/SQL procedure successfully completed