Oracle 11g中的Native PL/SQL代码编译(一)

2014-11-24 17:24:20 · 作者: · 浏览: 0

--------------------------------------分割线 --------------------------------------



相关阅读:


--------------------------------------分割线 --------------------------------------


1、PL/SQL语句Native化



PL/SQL语句的Native化,是从Oracle9i引入的。最开始进行native的初衷就是性能,通常native的PL/SQL代码要比解释形式(interpreted form)执行速度快。早期的native化是比较费力气的,需要我们提供出本地的编译器地址。

PL/SQL语句的native过程需要我们安装额外的C编译器,这个在一些生产环境下,还是有安全方面的顾虑的。


在9i和10g时代,数据库中包括一个参数名为plsql_native_library_dir,用于指定本地的编译器目录位置。在11g中,这个参数被取消,进行代码native的过程也变得比较简单起来。

在11g中,Oracle是不需要服务器上额外安装C编译器的。Oracle会直接将需要native化的PL/SQL代码转化到服务器上的shared library(DDL)。由此,进行PL/SQL的本地编译就变得很简单,只需要一个开关设备。这个就是Oracle参数plsql_code_type。

在使用native PL/SQL的时候,我们一定注意使用内存对象的不同。Native PL/SQL代码对应的机器码(machine code)在被调入数据库catalog之前,是与PGA内存进行映射。而解释代码(interpreted form code)则是和SGA进行对应。所以,在使用native code的时候,对SGA的消耗是减少的趋势。


2、开关参数plsql_code_type



从Oracle 11g开始,我们可以使用plsql_code_type来控制编译器选择开关。我们选择Oracle11g进行实验。




SQL> select * from v$version;



BANNER


--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production


PL/SQL Release 11.2.0.3.0 - Production


CORE 11.2.0.3.0 Production



TNS for Linux: Version 11.2.0.3.0 - Production


NLSRTL Version 11.2.0.3.0 – Production




相关参数




SQL> show parameter plsql_code


NAME TYPE VALUE


------------------------------------ ----------- ------------------------------


plsql_code_type string INTERPRETED




默认情况下,Oracle是选择解释代码的形式进行编译的。通过视图user/all/dba_plsql_object_settings,我们是可以看到对应存储代码对象使用的编译形式的。

首先,我们使用默认方式进行存储过程编译。




SQL> create or replace procedure P_RECE_CALL_TEST is


2 i number;


3 c number;


4 begin


5 for i in 1..100 loop


6 select count(*) into c from emp;


7 dbms_output.put_line(to_char(c));


8 end loop;


9 end P_RECE_CALL_TEST;


10 /



Procedure created



SQL> select name, plsql_code_type from user_plsql_object_settings;



NAME PLSQL_CODE_TYPE


------------------------------ --------------------


P_RECE_CALL_TEST INTERPRETED




代码对象的plsql_code_type列显示了对象的编译形式。我们对于单独的存储过程,可以不通过参数修改,而是在compile过程中,直接指定编译方式。这样也是可以将代码编译为native方式。



SQL> alter procedure p_rece_call_test compile plsql_code_type=native;


Procedure altered



SQL> select name, plsql_code_type from user_plsql_object_settings;


NAME PLSQL_CODE_TYPE


------------------------------ --------------------


P_RECE_CALL_TEST NATIVE




配置参数plsql_code_type比较简单,目前版本Oracle支持Interpreted和Native两个选项值。默认取值为Interpreted,表示将程序代码编译为解析形式。另一个就是Native,表示编译为本地代码。我们可以在session level进行灵活的配置。



SQL> alter session set plsql_code_type='native';


Session altered



SQL> alter procedure p_rece_call_test compile;


Procedure altered



SQL> select name, plsql_code_type from user_plsql_object_settings;



NAME PLSQL_CODE_TYPE


------------------------------ --------------------


P_RECE_CALL_TEST NATIVE




重新登录之后,可以将其编译回解释状态。




SQL> conn scott/tiger@ora11g;


Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0


Connected as scott



SQL> alter procedure p_rece_call_test compile;


Procedure altered



SQL> select name, plsql_code_type from user_plsql_object_settings;


NAME PLSQL_CODE_TYPE


----------------------------