--------------------------------------分割线 --------------------------------------
相关阅读:
--------------------------------------分割线 --------------------------------------
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
----------------------------