技术开发 频道

点评Oracle11g新特性:PLSQL新特性


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

    对于这个数据类型,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_TYPE为INTERPRETED的情况下,如果将参数改为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就需要用户自己控制溢出了,否则可能得到错误的结果。

0
相关文章