Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11680303
  • 博文数量: 8065
  • 博客积分: 10002
  • 博客等级: 中将
  • 技术积分: 96708
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 17:06
文章分类

全部博文(8065)

文章存档

2008年(8065)

分类: 服务器与存储

2008-07-16 10:20:44

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就需要用户自己控制溢出了,否则可能得到错误的结果。

阅读(285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~