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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++11新特性(三):語言特性C++
- 新特性
- Java 8新特性(三):Optional類Java
- React 新特性React
- 新特性介面
- Hadoop新特性Hadoop
- Java 11新特性Java
- Java 8 新特性Java
- Android 9.0新特性Android
- ES 2024 新特性
- Go 1.13 新特性Go
- Servlet 3.0 新特性Servlet
- MySQL 8.0 新特性MySql
- PHP 7.4 新特性PHP
- IDL 9.1新特性
- Java 8 新特性Java
- .NET 7新特性
- Prometheus 2.21.0 新特性Prometheus
- Java 17新特性Java
- PostgreSQL 13–新特性SQL
- C++新特性C++
- 玩轉iOS開發:iOS 11 新特性《Layout的新特性》iOS
- 【譯】ES2018 新特性:Rest/Spread 特性REST
- C++11新特性(一):語言特性C++
- C++11新特性(二):語言特性C++
- HTML5新特性HTML
- Swift 4.1 的新特性Swift
- React16 新特性React
- [譯] Swift 5.0 新特性Swift
- IntelliJ IDEA 2019.1 新特性IntelliJIdea
- Android O 新特性 — NotificationAndroid
- ES的那些新特性
- Redis5.0 新特性Redis
- css3 新特性CSSS3
- ES2023新特性
- ES2022新特性
- php8新特性PHP
- 新特性 Hook 簡述Hook
- PHP7 新特性PHP