问题描述
我的任务是提高我们应用程序中的某些软件包和过程的性能。我们有1个包,它有大约15-20个程序的子程序。
以下是我需要的澄清。
Iam将本地变量和过程参数的数据类型从NUMBER更改为PLS_INTEGER,并且在子程序中,但并非所有子程序都将影响调用包是否具有PLS_INTEGER并且子程序具有NUMBER数据类型,例如。
如上所述,主软件包具有参数a1,而a2具有PLS_INTEGER,但是在子过程中a1和a2用作数字,这对性能有任何问题吗?
以下是我需要的澄清。
Iam将本地变量和过程参数的数据类型从NUMBER更改为PLS_INTEGER,并且在子程序中,但并非所有子程序都将影响调用包是否具有PLS_INTEGER并且子程序具有NUMBER数据类型,例如。
PACK1.MAINPROC ( a1 PLS_INTEGER,a2 PLS_INTEGER,a3 PLS_INTEGER,a4 PLS_INEGER ) begin subprocedure1(a1,a2,a3) end mainproc procedure SUBPROCEDURE1( a1 NUMBER,a2 NUMBER,a3 number) begin .... end
如上所述,主软件包具有参数a1,而a2具有PLS_INTEGER,但是在子过程中a1和a2用作数字,这对性能有任何问题吗?
专家解答
Pls_integer及其子类型使用硬件算术来进行操作。但是数字使用库算术,速度较慢。
所以pls_integer更快。当您为数字分配pls_整数值时,数据库会隐式地将其转换为数字。所以你失去了硬件算术的好处。并有转换开销。
也就是说,除非你在做繁重的计算,否则你不太可能注意到这种差异:
因此,超过1000万次执行,数字仅慢了约1秒。所以0.1微秒/执行!
如果你试图让你的代码更快,几乎可以肯定你可以在其他地方获得更大的收益。用分层探查器跟踪您的代码,以找出在哪里
https://oracle-base.com/articles/11g/plsql-hierarchical-profiler-11gr1
所以pls_integer更快。当您为数字分配pls_整数值时,数据库会隐式地将其转换为数字。所以你失去了硬件算术的好处。并有转换开销。
也就是说,除非你在做繁重的计算,否则你不太可能注意到这种差异:
create or replace procedure p1 (
p1 pls_integer, p2 pls_integer, p3 pls_integer, p4 pls_integer
) as
v1 pls_integer;
begin
v1 := p1 + p2 + p3 + p4;
end p1;
/
create or replace procedure p2 (
p1 number, p2 number, p3 number, p4 number
) as
v1 number;
begin
v1 := p1 + p2 + p3 + p4;
end p2;
/
declare
v1 pls_integer := 1;
v2 pls_integer := 2;
v3 pls_integer := 3;
v4 pls_integer := 4;
start_time pls_integer;
iterations pls_integer := 10000000;
begin
start_time := dbms_utility.get_time ();
for i in 1 .. iterations loop
p1 ( v1, v2, v3, v4 );
end loop;
dbms_output.put_line ( 'PLS time ' || ( dbms_utility.get_time () - start_time ) ) ;
start_time := dbms_utility.get_time ();
for i in 1 .. iterations loop
p2 ( v1, v2, v3, v4 );
end loop;
dbms_output.put_line ( 'NUM time ' || ( dbms_utility.get_time () - start_time ) ) ;
end;
/
PLS time 252
NUM time 359
/
PLS time 255
NUM time 367
/
PLS time 270
NUM time 378因此,超过1000万次执行,数字仅慢了约1秒。所以0.1微秒/执行!
如果你试图让你的代码更快,几乎可以肯定你可以在其他地方获得更大的收益。用分层探查器跟踪您的代码,以找出在哪里
https://oracle-base.com/articles/11g/plsql-hierarchical-profiler-11gr1
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




