ITPub博客

首页 > 数据库 > Oracle > tom的runstats_pkg工具包关于批量插入和绑定变量分析-01

tom的runstats_pkg工具包关于批量插入和绑定变量分析-01

原创 Oracle 作者:dotaddjj 时间:2012-01-29 17:23:05 0 删除 编辑

今天迎来本命年的工作第一天,学习氛围还算不错,充满神奇的2012这一年自身又将有着怎样的变化,其实真是不得而知。给大家送一个迟来的新年快乐,当然今年可能以后很长一段时间都是坚持 习惯学习oracle,然后期待北漂寻求一份跟oracle开发管理相关的工作,认真的做下去,也期待遇见一个适龄的girl,一个人着实有点孤独。呜呜!

Tom开发的一个用于比较统计方法的工具runstats_pkg

先建立视图stats

create or replace view stats as

select 'STAT...'||a.name name,b.value from

v$statname a,v$mystat b

where a.statistic#=b.statistic#

union all

select 'LATCH...'||name,gets from v$latch

建立一个session临时表

Create global temporary table sys.run_stats

(runid varchar2(40),

Name varchar2(80),

Value number)

On commit preserve rows;

--Runstats_pkg包头:

create or replace package runstats_pkg

as

procedure rs_start;

procedure rs_middle;

procedure rs_stop(p_difference_threshold in number default 0);

end;

--Runstats_pkg包体:

create or replace package body runstats_pkg

as

g_start number;

g_run1 number;

g_run2 number;

procedure rs_start

as

begin

delete from run_stats;

insert into run_stats select 'before',stats.* from stats;

g_start:=dbms_utility.get_time;

end rs_start;

procedure rs_middle

as

begin

g_run1:=(dbms_utility.get_time-g_start);--运行第一中方法后的时间差

insert into run_stats select 'after 1',stats.* from stats;

g_start:=dbms_utility.get_time;--记录当前时间g_start

end rs_middle;

procedure rs_stop(p_difference_threshold in number default 0)

as

begin

g_run2:=(dbms_utility.get_time-g_start);

dbms_output.put_line('Run1 ran in '||g_run1);

dbms_output.put_line('Run1 ran in '||g_run2);

dbms_output.put_line('run 1 ran in'||round(g_run1/g_run2*100,2)||'% of the time');

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',10)||lpad('Run2',10)||lpad('Diff',10));

for x in (

select rpad(a.name,30)||

to_char(b.value-a.value,'9.999.999')||

to_char(c.value-b.value,'9.999.999')||

to_char(round(run1/run2*100,2),'999,99')||'%'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('Latches :');

dbms_output.put_line(lpad('Run1',10)||lpad('Run2',10)||lpad('Diff',10)||lpad('PCT',8));

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/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 rs_stop;

end;

利用上述runstats_pkg工具包可以用于区分统计两种方法产生的时间差和latch使用情况,由于latch是一种低级的串行化锁,用于保护内存不被同时修改,获取和释放都非常短,但生产中这种低级的串行化锁很多时候是系统性能瓶颈所在,某些时候我们甚至更关注latch的使用优先于所用的时间。

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1057201/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662972