Experience Native Plsql

默认情况下PLSQL对象在首次运行时进行Interprete编译,将编译后的对象存储在shared pool的PLSQL Object Area,并分配一个hash value.下次运行时会直接调用编译后或者解析后的PLSQL对象,不用在重现解析(hard parse).如果该PLSQL依赖的对象被修改、PLSQL对象本身被修改或者长期不运行,那么该PLSQL对象会从shared pool中移除,需要运行时会重新编译.PLSQL。还有另外一种可选的Compiling模式,那就是所谓的Native,本地编译模式.这种模式是将PLSQL编译成本机的机器代码,并产生一个本机的二进制shared library库文件,存储在服务器的文件系统上,需要执行时oracle会在后台自动执行该二进制文件。并将运行后的数据返回给服务器最后将结果传给session.从10G开始, Native模式可以也支持Rac系统.

  • NATIVE参数设置

1、plsql_code_type
  这个参数设置PLSQL对象的编译模式,默认为INTERPRETED,解析模式,我们需要修改为NATIVE。可以动态修改;
2、plsql_native_library_dir
  设置存储PLSQL对象二进制shared library库文件的目录,这个目录必须提前创建,并配置相应的权限,Oracle不会自动创建该目录。不支持动态修改,修改完需要restart database;
3、plsql_native_library_subdir_count
  这个参数在有些平台是可选的, 默认为0,因为在一些平台上,单个目录(plsql_native_library_dir)不能容纳大量的shared library文件,这个时候用该参数指定plsql_native_library_dir目录下创建的子目录的个数,指定了该参数之后,我们必须手动创建这些子目录,子目录以小写字母d+数字序号组成,eg:d0,d1,d2……dn.

  • NATIVE编译过程

1、native在起初编译PLSQL对象时,除了在plsql_native_library_dir目录产生shared library外,还同时会在ncomp_dll$表记录PLSQL的编译情况,如果PLSQL经过了多次编译,那么会在这种表记录它的编译历史和版本,Oracle始终会掉用最新版本的编译;
  2、native编译需要调用$ORACLE_HOME/plsql/spnc_commands命令:包含了C编译器以及NATIVE编译需要的其他库文件的路径;PLSQL二进制shared library文件的模板,一般情况下我们不需要修改该文件;
  3、plsql_native_library_dir目录下的shared library文件不能手动删除,在我们删除某个PLSQL对象时,该文件会被Oracle自动删除.

  • NATIVE测试
SQL> alter system set plsql_native_library_dir='/oracle/product/rac102/plsql/library' scope=spfile;

System altered.

SQL> alter system set plsql_native_library_subdir_count=2 scope=spfile;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  209715200 bytes
Fixed Size                  1266632 bytes
Variable Size             121637944 bytes
Database Buffers           83886080 bytes
Redo Buffers                2924544 bytes
Database mounted.
Database opened.
SQL> show parameter plsql_native

NAME
------------------------------------
TYPE
----------------------------------------------------------------
VALUE
------------------------------
plsql_native_library_dir
string
/oracle/product/rac102/plsql/l
ibrary
plsql_native_library_subdir_count
integer
2

切换用户,新建测试脚本,这里我们新建两个内容相同切名称不相同的两个程序,一个按native编译,一个按interpreted编译.对比下执行的情况.

SQL> connect mayp/mayp
Connected.
SQL> 

SQL> create or replace procedure inter_p
  2  is
  3  begin
  4   dbms_output.put_line('hello world!');
  5  end;
  6  /

Procedure created.

SQL> set timing on
SQL> create or replace procedure native_p
  2  is
  3  begin
  4    dbms_output.put_line('hello world!');
  5  end;
  6  /

Procedure created.

Elapsed: 00:00:00.05
SQL> 

再次重新编译存储过程

SQL> alter procedure inter_p compile plssql_code_type=INTERPRETED;
alter procedure inter_p compile plssql_code_type=INTERPRETED
                                *
ERROR at line 1:
ORA-00933: SQL command not properly ended

Elapsed: 00:00:00.00
SQL> alter procedure inter_p compile plsql_code_type=interpreted;

Procedure altered.

Elapsed: 00:00:00.31

SQL> alter procedure native_p compile plsql_code_type=native;

Procedure altered.

Elapsed: 00:00:00.09
SQL> 

SQL> select name,plsql_code_type,plsql_ccflags from user_plsql_object_settings where name like '%_P';

NAME                 PLSQL_CODE_TYPE
-------------------- ----------------
PLSQL_CCFLAGS
--------------------------------------------------------------------------------
INTER_P              INTERPRETED

NATIVE_P             NATIVE

这里native_p用native方式进行了编译。在plsql_native_library_dir的目录产生了一个shared library的二进制文件

[mayp@dbtest library]$ ls
d0  d1
[mayp@dbtest library]$ cd do
-bash: cd: do: No such file or directory
[mayp@dbtest library]$ cd d0
[mayp@dbtest d0]$ ls
[mayp@dbtest d0]$ cd ..
[mayp@dbtest library]$ ls
d0  d1
[mayp@dbtest library]$ cd d1
[mayp@dbtest d1]$ ls
NATIVE_P__MAYP__P__106498.so
[mayp@dbtest d1]$ ls -l
total 8
-rwxr-xr-x  1 mayp oinstall 2152 Jul 22 14:22 NATIVE_P__MAYP__P__106498.so

ncomp_dll$表也产生了一条native的记录

SQL> select obj#,version from ncomp_dll$;

      OBJ#    VERSION
---------- ----------
    106498  167772160

SQL> select object_name,object_type from dba_objects where object_id=106498;

OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE
--------------------------------------
NATIVE_P
PROCEDURE
  • NATIVE特点
  1. 执行效率高 对于大型的程序越能显示出高性能的特点;
  2. 10G开始支持RAC系统 plsql_native_library_dir可以是一个集群文件系统路径,也可以只一个non cluster文件系统路径(排除NFS文件系统);
  3. 维护简单, Native产生的shared library文件Oracle会自动维护,不需要DBA人为的干预(包括删除);
  4. 迁移不方便,如果要迁移native PLSQL对象那么在迁移之后需要重新用NATIVE编译;
  5. shared library可手动无条件的删除,如果不小心删除了shared library文件,再在执行时Oracle默认会用会用INTERPRETED模式重新编译;
  • NATIVE参考资源

http://www.oracle.com/technology/tech/pl_sql/htdocs/ncomp_faq.html

http://www.oracle.com/technology/tech/pl_sql/htdocs/new_in_10gr1.htm#harness Plsql的性能测试

Relative Posts

Tags: , ,

Leave a Reply