MYSQL教程之Oracle’s DBMS_Profiler:PL/SQL 功能调...
通过支付一定费用,客户可以得到优先的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企业版的支持和维护成本就更低了。 这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片? 外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。 个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。 groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。 大家注意一点。如下面的例子:
页:
[1]