Oracle11新特性——PLSQL新特性(三)
打算寫一系列的文章介紹11g的新特性和變化。
11g中PL/SQL新增了很多特性,在效能和易用性方面做了不少的提升,還有一些功能性的增強。
這篇介紹一下PLSQL的SIMPLE_INTEGER資料型別。
Oracle11新特性——PLSQL新特性(一):http://yangtingkun.itpub.net/post/468/395965
Oracle11新特性——PLSQL新特性(二):http://yangtingkun.itpub.net/post/468/396571
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就需要使用者自己控制溢位了,否則可能得到錯誤的結果。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69429/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle11新特性——PLSQL新特性(七)OracleSQL
- Oracle11新特性——PLSQL新特性(六)OracleSQL
- Oracle11新特性——PLSQL新特性(五)OracleSQL
- Oracle11新特性——PLSQL新特性(四)OracleSQL
- Oracle11新特性——PLSQL新特性(二)OracleSQL
- Oracle11新特性——PLSQL新特性(一)OracleSQL
- Oracle11新特性——PLSQL函式快取結果(三)OracleSQL函式快取
- Oracle11新特性——PLSQL函式快取結果(一)OracleSQL函式快取
- Oracle11新特性——PLSQL函式快取結果(二)OracleSQL函式快取
- Oracle11新特性——撤銷事務(三)Oracle
- Oracle11新特性——分割槽功能增強(三)Oracle
- Oracle11新特性——虛擬列Oracle
- Oracle11新特性——SQL快取結果集(三)OracleSQL快取
- Oracle11新特性——虛擬列(二)Oracle
- Oracle11新特性——備份恢復功能增強(三)Oracle
- Oracle11新特性——線上操作功能增強(三)Oracle
- Oracle11新特性——撤銷事務(一)Oracle
- Oracle11新特性——分割槽功能增強Oracle
- Oracle11新特性——撤銷事務(二)Oracle
- Oracle11新特性——分割槽功能增強(五)Oracle
- Oracle11新特性——分割槽功能增強(四)Oracle
- Oracle11新特性——行列轉換語句(二)Oracle
- Oracle11新特性——行列轉換語句(一)Oracle
- Oracle11新特性——分割槽功能增強(二)Oracle
- Oracle11新特性——分割槽功能增強(一)Oracle
- Oracle11新特性——備份恢復功能增強Oracle
- Oracle11新特性——SQL快取結果集(五)OracleSQL快取
- 【MySQL】5.7新特性之三MySql
- 新特性
- Oracle11新特性——備份恢復功能增強(六)Oracle
- Oracle11新特性——備份恢復功能增強(五)Oracle
- Oracle11新特性——備份恢復功能增強(四)Oracle
- Oracle11新特性——備份恢復功能增強(二)Oracle
- Oracle11新特性——備份恢復功能增強(一)Oracle
- Oracle11新特性——備份恢復功能增強(十)Oracle
- Oracle11新特性——備份恢復功能增強(九)Oracle
- Oracle11新特性——備份恢復功能增強(八)Oracle
- Oracle11新特性——備份恢復功能增強(七)Oracle