ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle11新特性——PLSQL新特性(三)

Oracle11新特性——PLSQL新特性(三)

原创 Linux操作系统 作者:yangtingkun 时间:2007-09-19 00:00:00 0 删除 编辑

打算写一系列的文章介绍11g的新特性和变化。

11gPL/SQL新增了很多特性,在性能和易用性方面做了不少的提升,还有一些功能性的增强。

这篇介绍一下PLSQLSIMPLE_INTEGER数据类型。

Oracle11新特性——PLSQL新特性(一):http://yangtingkun.itpub.net/post/468/395965

Oracle11新特性——PLSQL新特性(二):http://yangtingkun.itpub.net/post/468/396571


Oracle11g推出了一个新的数据类型SIMPLE_INTEGER,这种数据类型表示-21474836482147483647,这个数据类型不为空。

对于这个数据类型,Oracle就不会进行空的判断,也不会处理溢出的情况。因此Oracle可以将这个数据类型的操作直接作用于硬件,从而提高性能。

下面简单对比一下NUMBER类型和SIMPLE_INTEGER类型的性能差别:

SQL> SHOW PARAMETER PLSQL_CODE_TYPE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
plsql_code_type string INTERPRETED
SQL> CREATE OR REPLACE PROCEDURE P_NUMBER AS
2 V_NUM1 NUMBER DEFAULT 1;
3 V_NUM2 NUMBER DEFAULT 2;
4 BEGIN
5 FOR I IN 1..1000000 LOOP
6 V_NUM1 := V_NUM1 + V_NUM2 - V_NUM1 * V_NUM2;
7 V_NUM2 := (V_NUM2 + V_NUM1 * V_NUM2) / V_NUM2;
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('V_NUM1: ' || V_NUM1);
10 DBMS_OUTPUT.PUT_LINE('V_NUM2: ' || V_NUM2);
11 END;
12 /

过程已创建。

SQL> CREATE OR REPLACE PROCEDURE P_SIMPLE_INTEGER AS
2 V_NUM1 SIMPLE_INTEGER DEFAULT 1;
3 V_NUM2 SIMPLE_INTEGER DEFAULT 2;
4 BEGIN
5 FOR I IN 1..1000000 LOOP
6 V_NUM1 := V_NUM1 + V_NUM2 - V_NUM1 * V_NUM2;
7 V_NUM2 := (V_NUM2 + V_NUM1 * V_NUM2) / V_NUM2;
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('V_NUM1: ' || V_NUM1);
10 DBMS_OUTPUT.PUT_LINE('V_NUM2: ' || V_NUM2);
11 END;
12 /

过程已创建。

SQL> SET SERVEROUT ON
SQL> SET TIMING ON
SQL> EXEC P_NUMBER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.73
SQL> EXEC P_NUMBER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.48
SQL> EXEC P_SIMPLE_INTEGER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.42
SQL> EXEC P_SIMPLE_INTEGER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.40

从上面的对比可以看到,使用SIMPLE_INTEGER大概可以得到1/6的性能提升,这还是在PLSQL_CODE_TYPEINTERPRETED的情况下,如果将参数改为NATIVE,性能提升更加明显:

SQL> SET TIMING OFF
SQL> ALTER SESSION SET PLSQL_CODE_TYPE = NATIVE;

会话已更改。

SQL> CREATE OR REPLACE PROCEDURE P_NUMBER AS
2 V_NUM1 NUMBER DEFAULT 1;
3 V_NUM2 NUMBER DEFAULT 2;
4 BEGIN
5 FOR I IN 1..1000000 LOOP
6 V_NUM1 := V_NUM1 + V_NUM2 - V_NUM1 * V_NUM2;
7 V_NUM2 := (V_NUM2 + V_NUM1 * V_NUM2) / V_NUM2;
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('V_NUM1: ' || V_NUM1);
10 DBMS_OUTPUT.PUT_LINE('V_NUM2: ' || V_NUM2);
11 END;
12 /

过程已创建。

SQL> CREATE OR REPLACE PROCEDURE P_SIMPLE_INTEGER AS
2 V_NUM1 SIMPLE_INTEGER DEFAULT 1;
3 V_NUM2 SIMPLE_INTEGER DEFAULT 2;
4 BEGIN
5 FOR I IN 1..1000000 LOOP
6 V_NUM1 := V_NUM1 + V_NUM2 - V_NUM1 * V_NUM2;
7 V_NUM2 := (V_NUM2 + V_NUM1 * V_NUM2) / V_NUM2;
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('V_NUM1: ' || V_NUM1);
10 DBMS_OUTPUT.PUT_LINE('V_NUM2: ' || V_NUM2);
11 END;
12 /

过程已创建。

SQL> SET TIMING ON
SQL> EXEC P_NUMBER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.40
SQL> EXEC P_NUMBER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.40
SQL> EXEC P_SIMPLE_INTEGER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.26
SQL> EXEC P_SIMPLE_INTEGER
V_NUM1: 1
V_NUM2: 2

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.25

首先可以看到PLSQL_CODE_TYPE设置为NATIVE带来的性能提升,使用NUMBER提升了1/6,而使用SIMPLE_INTEGER则提升了3/8

现在采用SIMPLE_INTEGER数据类型只需要NUMBER类型的5/8的时间。可见不管PLSQL_CODE_TYPE设置为何值,采用SIMPLE_INTEGER都能带来性能的提升。

不过使用SIMPLE_INTEGER就需要用户自己控制溢出了,否则可能得到错误的结果。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69429/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10487267