暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle 程序性能编号与Pls_integer

askTom 2018-05-24
414

问题描述

我的任务是提高我们应用程序中的某些软件包和过程的性能。我们有1个包,它有大约15-20个程序的子程序。

以下是我需要的澄清。

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_整数值时,数据库会隐式地将其转换为数字。所以你失去了硬件算术的好处。并有转换开销。

也就是说,除非你在做繁重的计算,否则你不太可能注意到这种差异:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论