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化的程序在迁移、升级的时候,也许会有很多额外的问题和关注点。也是我们需要注意慎用的方面。
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化的程序在迁移、升级的时候,也许会有很多额外的问题和关注点。也是我们需要注意慎用的方面。