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

yangtingkun發表於2007-09-19

打算寫一系列的文章介紹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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章