部署Thomas Kyte 的 runstats 工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署Thomas Kyte 的 runstats 工具相关的知识,希望对你有一定的参考价值。

runstats是由Thomas Kyte开发的脚本,该脚本能对做同一件事的两个不同方法进行比较,得出孰优孰劣的结果。

 

1.授权

 

SQL> grant select on v_$statname to livan;

Grant succeeded.

SQL> grant select on v_$mystat to livan;

Grant succeeded.

SQL> grant select on v_$timer to livan;

Grant succeeded.

SQL> grant select on v_$latch to livan;

Grant succeeded.

 

2.创建视图

SQL> conn livan/livan
Connected.
SQL> create or replace view stats
  2  as select STAT... || a.name name,b.value
  3  from v$statname a, v$mystat b
  4  where a.statistic# = b.statistic#
  5  union all
  6  select LATCH. || name,gets
  7  from v$latch
  8  union all
  9  select STAT...Elapsed Time,hsecs from v$timer;

View created.

 

3.创建统计结果临时表

SQL> create global temporary table run_stats
  2  ( runid varchar2(15),
  3  name varchar2(80),
  4  value int)
  5  on commit preserve rows;

Table created.

 

4.创建runstats包

 

--runstats开始调用rs_start
--rs_middle在中间调用
--完成时调用rs_stop,并打印报告

 

--创建包头

SQL> create or replace package runstats_pkg
  2  as
  3      procedure rs_start;
  4      procedure rs_middle;
  5      procedure rs_stop(p_difference_threshold in number default 0);
  6  end;
  7  /

Package created.

 

--创建包体

[[email protected] ~]$ vi body_runstats_pkg.sql

    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 (c.value-a.value)>0
      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,9,999,999)||
       to_char(run2,9,999,999)||
       to_char(diff,9,999,999)||
       to_char(round(run1/decode(run2,0,to_number(0),run2*100,2)),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;


"body_runstats_pkg.sql" [New] 95L, 2589C written



SQL> @body_runstats_pkg.sql
 96  /

Package body created.


 

 

5.测验

 

SQL> execute runstats_pkg.rs_start;

PL/SQL procedure successfully completed.

SQL> insert into t1 select * from dba_objects;

72898 rows created.

SQL> commit;

Commit complete.

SQL> execute runstats_pkg.rs_middle;

PL/SQL procedure successfully completed.

SQL> begin
  2  for x in (select * from dba_objects)
  3  loop
  4  insert into t2 values x;
  5  end loop;
  6  commit;
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL> execute runstats_pkg.rs_stop(10000000);

PL/SQL procedure successfully completed.

SQL> set serveroutput on
SQL> execute runstats_pkg.rs_stop(10000000);
Run1 ran in60cpu hsecs
Run2 ran in425cpu hsecs
run 1 ran in14.12% of the time

Name                                  Run1        Run2        Diff
STAT...redo size                 8,577,680  29,178,972  20,601,292
STAT...redo size                 8,577,680  29,183,900  20,606,220

Run1 latches total versus runs -- difference and pct
Run1        Run2        Diff       Pct
146,010 1,069,172   923,162%

PL/SQL procedure successfully completed.

 

 

show_space过程参考博主:

http://blog.csdn.net/huang_xw/article/details/7015349

以上是关于部署Thomas Kyte 的 runstats 工具的主要内容,如果未能解决你的问题,请参考以下文章

db2查看runstats进度

ThreadPoolExecutor的runState和workCount变量怎么存储?

sql 显示当前的runstats

db2 reorg runstats rebind具体操作

Docker部署freeswitch

thomas brinkhoff 基于路网的移动对象生成器不会用,有没有源代码神马的!求高手指教!!