|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
通过支付一定费用,客户可以得到优先的24/7支持,访问内容丰富的在线知识库和联系一个专门的技术负责经理。oracle|功能
Oracle’sDBMS_Profiler:PL/SQL功能调剂
DBMS_PROFILER包举例
上面是我供应的如何利用设置的复杂例子,运转设置文件来测试上面例程的功能.例程用到的自界说剧本紧随厥后.
1.创立历程.
createorreplaceproceduream_perf_chk(pi_seqinnumber,
pio_statusinoutnocopyvarchar2)is
l_datdate:=sysdate;
begin
iftrunc(l_dat)=21-sep-02andpi_seq=1then
pio_status:=OK;
else
pio_status:=Invalidtapeloaded;
endif;
exception
whenothersthen
pio_status:=Errorinam_perf_chek;
end;
2.用设置文件挪用例程
交换下面的例程,实行call_profiler.sql剧本(剧本代码拜见上面),传进pi_seq=2
SQL>@d:amcall_profiler.sql
Profilerstarted
Invalidtapeloaded
PL/SQLproceduresuccessfullycompleted.
Profilerstopped
Profilerflushed
runid:8
3.评价实行工夫:
实行eavluate_profiler_results.sql剧本,失掉工夫统计
SQL>@d:amevaluate_profiler_results.sql
Entervalueforrunid:8
Entervalueforname:am_perf_chk
Entervalueforowner:scott
LineOccurMsecText
-------------------------------------------------------------------------------------------------
1proceduream_perf_chk(pi_seqinnumber,
2pio_statusinoutnocopyvarchar2)is
3243.05965l_datdate:=sysdate;
4begin
5186.35732iftrunc(l_dat)=21-sep-02andpi_seq=1then
600pio_status:=OK;
7else
818.416151pio_status:=Invalidtapeloaded;
9endif;
10exception
11whenothersthen
1200pio_status:=Errorinam_perf_chek;!
1312.410361end;
13rowsselected.
Code%coverage
--------------
66.6666667
4.正如你看到的,第三行实行工夫进步到86毫秒.可是改动if语句,从头实行下面的历程,将会失掉新的了局:
LineOccurMsecText
-------------------------------------------------------------------------------------------------
1proceduream_perf_chk(pi_seqinnumber,
2pio_statusinoutnocopyvarchar2)is
3217.978816l_datdate:=sysdate;
4begin
518.419503ifpi_seq=1andtrunc(l_dat)=21-sep-02then
600pio_status:=OK;
7else
817.512684pio_status:=Invalidtapeloaded;
9endif;
10exception
11whenothersthen
1200pio_status:=Errorin!am_perf_chek;
131.731657end;
13rowsselected.
Code%coverage
--------------
66.6666667
5.正如你看到的,这类情境下第三行实行工夫从86毫秒削减到8毫秒,过剩的工夫是因为内置trunc()函数引发.,这类情境下假如第一个前提为false,则不会实行trunc()函数.这仅仅是个复杂的例子,当你测试的例程越年夜,你面对的应战更年夜.
这个设置了局也证实了实行时代代码被掩盖几行,从而让我们晓得处于功能监督中的代码局限。假如任何PL/SQL块功能呈现成绩,它也能提炼出各类分歧情形的正在在实行的代码并反省设置了局,从而查明成绩地点。
6.关于一个特定的情形,假如实行一段特别的代码段,能够失掉公道的剖析,即便代码基本一点都不克不及运转。
情况的创立
默许安装或数据库的创立形态下,DBMS_PROFILER包不会主动安装,请DBA用profload.sql剧本创立它.用一个权限较年夜的或一个独自的用户,创立存储统计信息的表。假如
用如SYS用户创立,则给别的用户授与DML权限,而且对这些表创立一个配合的简写名.
创立表的以下:
PLSQL_PROFILER_RUNS表:PL/SQL设置的运转细节.
PLSQL_PROFILER_UNITS表:运转中每个库单位的信息.
PLSQL_PROFILER_DATA表:一切设置文件运转时的数据积累.
PLSQL_PROFILER_RUNNUMBER序列供应了RUNID
运转息争释设置数据
ORACLE供应了三个表来统计,添补RUNID。有很多第三方的工具能够供应自界说的基于这些数据的呈报,ORACLE供应profrep.sql剧本评价数据(在<oracle_home>plsqldemo目次下),上面的两个复杂剧本就是下面用到的,用来反省程序单位的实行工夫.实行工夫以毫秒存储
-----------------------------------------------------------
Script:call_profiler.sql
-----------------------------------------------------------
setheadoff
setpages0
selectdecode(dbms_profiler.start_profiler,0,Profilerstarted,Profilererror)
fromdual;
--<placeyourroutineinthebelowblock>--
declare
l_statusvarchar2(200);
begin
am_perf_chk(2,l_status);
dbms_output.put_line(l_status);
end;
/
selectdecode(dbms_profiler.stop_profiler,0,Profilerstopped,Profilererror)
fromdual;
selectdecode(dbms_profiler.flush_data,0,Profilerflushed,Profilererror)
fromdual;
selectrunid:||plsql_profiler_runnumber.currval
fromdual;
setheadon
setpages200
-----------------------------------------------------------
Script:evaluate_profiler_results.sql
-----------------------------------------------------------
undefrunid
undefowner
undefname
setverifyoff
selects.line"Line",p.total_occur"Occur",p.total_time"Msec",s.text"Text"
fromall_sources,(selectu.unit_owner,u.unit_name,u.unit_type,d.line#,
d.total_occur,d.total_time/1000000total_time
fromplsql_profiler_datad,plsql_profiler_unitsu
whereu.runid=&&runid
andu.runid=d.runid
andu.unit_number=d.unit_number)p
wheres.owner=p.unit_owner(+)
ands.name=p.unit_name(+)
ands.type=p.unit_type(+)
ands.line=p.line#(+)
ands.name=upper(&&name)
ands.owner=upper(&&owner)
orderbys.line;
selectexec.cnt/total.cnt*100"Code%coverage"
from(selectcount(1)cnt
fromplsql_profiler_datad,plsql_profiler_unitsu
whered.runid=&&runid
andu.runid=d.runid
andu.unit_number=d.unit_number
andu.unit_name=upper(&&name)
andu.unit_owner=upper(&&owner))total,
(selectcount(1)cnt
fromplsql_profiler_datad,plsql_profiler_unitsu
whered.runid=&&runid
andu.runid=d.runid
andu.unit_number=d.unit_number
andu.unit_name=upper(&&name)
andu.unit_owner=upper(&&owner)
andd.total_occur>0)exec;
undefrunid
undefowner
undefname
结论
DBMS_PROFILER长短常壮大的工具,其一就是能够辨认PL/SQL的功能成绩.这个工具最好用在开辟时代,用来调剂基于各类使用的情形的代码,它也能用很好的调剂已在利用中的例程而且接纳不言而喻的工夫往实行。总之,这个工具能够给每行代码赐与功能统计,它能够匡助我们评价和调剂到一个杰出的程度,当反省SQL语句的功能成绩时,PL/SQL代码不该该疏忽,相反响该调剂到最好的了局.
你会发现实际上MySQL可以更少地占用资金,前者的每CPU许可费用一般从4000美元到25000美元不等,而MySQL企业版的支持和维护成本就更低了。 |
|