📄 第十二章 pl-sql应用程序性能调优 - pl-sql用户指南与参考 - whatiswhat.htm
字号:
INTO子句引用了一个集合,那就配合BULK COLLECT子句一起使用。
<LI>如果可能的话,尽量在应用程序和服务器之间使用主数组传递集合。
<LI>如果DML操作失败时且不是很重大的问题,就可以在FORALL语句中使用SAVE
EXCEPTIONS,然后在以后的循环中使用%BULK_EXCEPTIONS属性报告或清除错误。
</LI></OL>
<P>不要忽略这些小问题,因为它们可以帮助我们分析流程控制和程序的依赖性。 </P>
<P class=title2>3、使用NOCOPY编译器提示优化PL/SQL</P>
<P>默认情况下,OUT和IN OUT模式的参数都是按值传递的。也就是说,一个IN
OUT实参会把它的副本拷贝到对应的形参中。然后,如果程序执行正确的话,这个值又会重新赋给OUT和IN
OUT的实参。 </P>
<P>但实参是集合、记录和对象实例这样的大的数据结构时,生成一个副本会极大地降低执行效率并消耗大量内存的。为了解决这个问题,我们可以使用编译器提示NOCOPY,它能让编译器把OUT和IN
OUT参数按引用传递。下例中,我们就能让编译器按引用传递IN OUT参数my_unit: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> platoon <STRONG>IS</STRONG> VARRAY(200) <STRONG>OF</STRONG> soldier;<BR> <STRONG>PROCEDURE</STRONG> reorganize(my_unit <STRONG>IN</STRONG> <STRONG>OUT</STRONG> <STRONG>NOCOPY</STRONG> platoon) <STRONG>IS</STRONG> ...<BR> <STRONG>BEGIN</STRONG><BR> ...<BR> <STRONG>END</STRONG>;<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title2>4、使用RETURNING子句优化PL/SQL</P>
<P>通常,应用程序需要得到SQL操作所影响到的行信息。INSERT、UPDATE和DELETE语句都可以包含一个RETURNING子句,这样就能返回处理过的字段信息。也就不用在INSERT、UPDATE之后或DELETE之前使用SELECT来查询影响到的数据。这样也能够减少网络流量,缩短CPU时间,需要更少量的游标和服务器内存需求。
</P>
<P>在下面的例子中,我们就在更新雇员工资的同时,把当前雇员的姓名和新的工资赋给PL/SQL变量: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>PROCEDURE</STRONG> update_salary(emp_id <STRONG>NUMBER</STRONG>) <STRONG>IS</STRONG><BR> "name" <STRONG>VARCHAR2</STRONG>(15);<BR> new_sal <STRONG>NUMBER</STRONG>;<BR><STRONG>BEGIN</STRONG><BR> <STRONG>UPDATE</STRONG> emp <BR> <STRONG>SET</STRONG> sal = sal * 1.1<BR> <STRONG>WHERE</STRONG> empno = emp_id RETURNING ename, sal <STRONG>INTO</STRONG> "name", new_sal;<BR> <EM>-- Now do computations involving name and new_sal</EM><BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title2>5、使用外部程序优化PL/SQL</P>
<P>PL/SQL提供了调用其他语言编写的程序的接口。PL/SQL可以从程序中调用其他语言所编写的标准库。这就能够提高可重用性、高效性和程序的模块化。</P>
<P>PL/SQL是专门用来进行SQL事务处理的。有些任务在像C这样的低阶语言中处理起来会更加有效。 </P>
<P>为了提高执行速度,我们可以用C语言重新编写受计算量限制的程序。此外,我们还可以把这样的程序从客户端移植到服务器端,这样可以减少网络流量,更有效地利用资源。
</P>
<P>例如,我们用C语言写一个使用图形对象类型的方法,把它封装到动态链接库(DLL)中,并在PL/SQL中注册,然后我们就能从应用程序中调用它。运行时,库会被动态地加载,为了安全起见,它会在一个单独的地址空间运行。
</P>
<P class=title2>6、使用对象类型和集合优化PL/SQL</P>
<P>集合类型和对象类型在对真实世界中的实体进行数据建模时能帮助我们提高效率。复杂的实体和关系会被直接映射到对象类型中。并且,一个构建良好的对象模型能够消除多表连接,减少来回往返等等,从而改善应用程序性能。
</P>
<P>客户端程序,包括PL/SQL程序,可以声明对象和集合,把它们作为参数传递,存放在数据库中,检索等等。同样,对象类型还可以把数据操作进行封装,把数据维护代码从SQL脚本中移出,把PL/SQL块放入方法中。
</P>
<P>对象和集合在存储和检索方面更加高效,因为它们是作为一个整体进行操作的。同样,对象类型还能和数据库整合在一起,利用Oracle本身所提供的易扩缩性和性能改善等优点。
</P>
<P class=title2>7、编译本地执行的PL/SQL代码</P>
<P>我们可以把PL/SQL过程编译成本地代码放到共享库中,这样就能提高它的执行速度。过程还可以被转换成C代码,然后用普通的C编译器编译,连接到
Oracle进程中。我们可以在Oracle提供的包和我们自己编写的过程中使用这项技术。这样编译出来的过程可以在各种服务器环境中工作。因为这项技术对从PL/SQL中调用的SQL语句提高效率并不明显,所以它通常应用在计算度高而执行SQL时间不多的PL/SQL过程上。
</P>
<P>要提高一个或多个过程的执行速度,我们可以这样使用这项技术: </P>
<OL>
<LI>更新makefile并为我们的系统键入适当的路径和其他值。makefile路径是$ORACLE_HOME/plsql/spnc_makefile.mk。
<LI>通过使用ALTER SYSTEM或ALTER
SESSION命令,或通过更新初始化文件,设置参数PLSQL_COMPILER_FLAGS来包含值NATIVE。默认设置包含的值是INTERPRETED,我们必须把它从参数值中删除。
<LI>使用下面几个方法编译一个或多个过程:
<OL>
<LI>使用ALTER PROCEDURE或ALTER PACKAGE命令重新编译过程或整个包。
<LI>删除过程并重新创建。<BR>
<LI>使用CREATE OR REPLACE重新编译过程。<BR>
<LI>运行SQL*Plus脚本建立一组Oracle系统包。<BR>
<LI>用含有PLSQL_COMPILER_FLAGS=NATIVE的初始化文件创建数据库。在创建数据库时,用UTLIRP脚本运行并编译Oracle系统包。
</LI></OL>
<LI>要确定我们所做的步骤是否有效,可以查询数据词典来查看过程是否是被编译为本地执行,查询用的视图是USER_STORED_SETTINGS、
DBA_STORED_SETTINGS和ALL_STORED_SETTINGS。例如,要查看MY_PROC的状态,我们可以输入:
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>SELECT</STRONG> param_value<BR> <STRONG>FROM</STRONG> user_stored_settings<BR> <STRONG>WHERE</STRONG> param_name = <EM>'PLSQL_COMPILER_FLAGS'</EM><BR> <STRONG>AND</STRONG> object_name = <EM>'MY_PROC'</EM>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>PARAM_VALUE字段值为NATIVE时,代表过程是被编译本地执行的,否则就是INTERPRETED。
</LI></OL>
<P>过程编译后就会被转到共享库,它们会被自动地连接到Oracle进程中。我们不需要重新启动数据库,或是把共享库放到另外一个地方。我们可以在存储过程之间反复调用它们,不管它们是以默认方式(interpreted)编译,本地执行方式编译还是采用两种混合的编译方式。
</P>
<P>因为PLSQL_COMPILER_FLAGS设置是保存在每个过程的库单元里的,当被编译成本地执行的过程失效时,在重新编译的时候还会采用原先的编译方式。
</P>
<P>我们可以通过ALTER SYSTEM或ALTER
SESSION命令,或通过设置初始化文件中的参数来控制PL/SQL本地编译的行为: </P>
<OL>
<LI>PLSQL_COMPILER_FLAGS
<LI>PLSQL_NATIVE_LIBRARY_DIR (因为安全原因,不能使用ALTER
SESSION进行设置)
<LI>PLSQL_NATIVE_LIBRARY_SUBDIR_COUNT
<LI>PLSQL_NATIVE_MAKE_UTILITY
<LI>PLSQL_NATIVE_MAKE_FILE_NAME </LI></OL>
<P>编译本地执行的PL/SQL过程举例: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>CONNECT</STRONG> scott/tiger;<BR><STRONG>SET</STRONG> serveroutput <STRONG>ON</STRONG>;<BR><STRONG>ALTER</STRONG> SESSION <STRONG>SET</STRONG> plsql_native_library_dir=<EM>'/home/orauser/lib'</EM>;<BR><STRONG>ALTER</STRONG> SESSION <STRONG>SET</STRONG> plsql_native_make_utility=<EM>'gmake'</EM>;<BR><STRONG>ALTER</STRONG> SESSION <STRONG>SET</STRONG> plsql_native_make_file_name=<EM>'/home/orauser/spnc_makefile.mk'</EM>;<BR><STRONG>ALTER</STRONG> SESSION <STRONG>SET</STRONG> plsql_compiler_flags=<EM>'NATIVE'</EM>;<BR><BR><STRONG>CREATE</STRONG> <STRONG>OR</STRONG> REPLACE <STRONG>PROCEDURE</STRONG> hello_native_compilation <STRONG>AS</STRONG><BR><STRONG>BEGIN</STRONG><BR> dbms_output.put_line(<EM>'hello world'</EM>);<BR> <STRONG>SELECT</STRONG> <STRONG>SYSDATE</STRONG> <STRONG>FROM</STRONG> dual;<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>过程编译时,我们可以看到各种被执行的编译和连接命令。然后过程就马上可以被调用,直接在Oracle进程中被作为共享库直接运行。
</P></DIV></DIV></TD></TR></TBODY></TABLE>
<P style="MARGIN: 5px; LINE-HEIGHT: 150%"></P></TD></TR>
<TR>
<TD align=middle height=25><FONT color=#295200>发表于: 2008-04-08
,修改于: 2008-04-08 14:48,已浏览80次,有评论0条</FONT> <A id=star
title=推荐这篇文章 onclick="NewWindows(this.href);return false;"
href="http://blog.chinaunix.net/u2/star.php?blogid=44734&artid=522010">推荐</A>
<A id=complaint title=投诉这篇文章
onclick="NewWindows(this.href);return false;"
href="http://blog.chinaunix.net/u2/complaint.php?blogid=44734&artid=522010">投诉</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD>
<TD width=18
background="第十二章 PL-SQL应用程序性能调优 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_right.gif"></TD></TR>
<TR>
<TD width=18 height=28><IMG alt=""
src="第十二章 PL-SQL应用程序性能调优 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_left_bottom.gif"
border=0></TD>
<TD
background="第十二章 PL-SQL应用程序性能调优 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_bottom.gif">
<P style="MARGIN: 5px; LINE-HEIGHT: 150%"></P></TD>
<TD width=18 height=28><IMG alt=""
src="第十二章 PL-SQL应用程序性能调优 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_right_bottom.gif"
border=0></TD></TR></TBODY></TABLE><BR>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#a5bd6b cellSpacing=1
cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD style="COLOR: #295200" bgColor=#eff7de height=25><B>网友评论</B></TD></TR>
<TR>
<TD bgColor=#ffffff height=1></TD></TR>
<TR>
<TD align=middle bgColor=#f9f5e7>
<TABLE
style="COLOR: #295200; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word"
cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
<TBODY></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#a5bd6b cellSpacing=1
cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD style="COLOR: #295200" bgColor=#eff7de height=25><B>发表评论</B></TD></TR>
<TR>
<TD bgColor=#ffffff height=1></TD></TR>
<TR>
<TD align=middle bgColor=#f9f5e7><IFRAME name=comment
src="第十二章 PL-SQL应用程序性能调优 - PL-SQL用户指南与参考 - whatiswhat.files/comment.htm"
frameBorder=0 width="100%"
height=160></IFRAME></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -