plsql本地编译与解释执行性能差异对比

来源:互联网 发布:找人做网站排名优化 编辑:程序博客网 时间:2024/05/05 17:22
fibonacci函数测试
create or replace function fib(n number)
return number
is
begin
if(n<=2) then
return n;
else
return fib(n-1)+fib(n-2);
end if;
end;
/
1. 解释执行
SQL> select name ,plsql_code_type from user_plsql_object_settings;

NAME                 PLSQL_CODE_TYPE
-------------------- ----------------------------------------
FIB                  INTERPRETED
--清理shared_pool和buffer_cache
SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush buffer_cache;

System altered.

SQL> set timing on;
SQL> set serveroutput on;
SQL> declare
  2  n number;
  3  begin
  4  n := fib(40);
  5  dbms_output.put_line('Result is :'||n);
  6  end;
  7  /
Result is :165580141

PL/SQL procedure successfully completed.

Elapsed: 00:01:40.47

2. 本地编译
SQL> alter function fib compile plsql_code_type=native;

Function altered.

Elapsed: 00:00:00.37
SQL> select name,plsql_code_type from user_plsql_object_settings;

NAME                 PLSQL_CODE_TYPE
-------------------- ----------------------------------------
FIB                  NATIVE
alter system flush shared_pool;
alter system flush buffer_cache;

SQL> declare
  2  n number;
  3  begin
  4  n := fib(40);
  5  dbms_output.put_line('Result is :'||n);
  6  end;
  7  /
Result is :165580141

PL/SQL procedure successfully completed.

Elapsed: 00:00:57.52

性能从1分40秒提升为57秒,差异还是比较大的,如果以计算或判断为主的plsql代码可考虑此类方式优化。

参考:http://otn.itpub.net/17203031/viewspace-777265/
引用自以上链接:编写pl/sql代码的时候,性能是一个非常重要的考量方式。Native程序化在一定程度上可以提高效率。不过应该看到,Native化程序是有条件的。Native PL/SQL节省的时间成本在PL/SQL引擎的层面,而SQL语句引擎方面不会有很大程度的提升。
所以,如果我们的代码中以流程、计算和循环判断为主体,SQL语句相对较少,那么使用Native化是比较“划算”的。反之,如果主要都是在进行SQL语句计算操作,即使我们将代码Native化,获取到的优势也比较少。
另一方面,Native化的程序在迁移、升级的时候,也许会有很多额外的问题和关注点。也是我们需要注意慎用的方面。
0 0
原创粉丝点击