li
  当前位置:主页 > 性能优化 > 文章内容
li
Oracle11新特性——PLSQL新特性(四)
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:2  
本文章共2918字,分2页,当前第1页,快速翻页:
 

打算写一系列的文章介绍11g的新特性和变化。

11gPL/SQL新增了很多特性,在性能和易用性方面做了不少的提升,还有一些功能性的增强。

这篇介绍一下PLSQLinlining优化。

Oracle11新特性——PLSQL新特性(一):http://yangtingkun.itpub.net/post/468/395965

Oracle11新特性——PLSQL新特性(二):http://yangtingkun.itpub.net/post/468/396571

Oracle11新特性——PLSQL新特性(三):http://yangtingkun.itpub.net/post/468/396994


Oracle在调用函数的时候可以将调用过程直接替换为子查询的代码,这样可以避免在运行过程中调用开销,Oracle提供了一个新的PRAGMA INLINE来指示函数是否进行INLINE优化:

SQL> CREATE OR REPLACE FUNCTION F_TEST (P_IN IN NUMBER) RETURN NUMBER AS
2 BEGIN
3 IF P_IN > 1 THEN
4 RETURN P_IN F_TEST(P_IN - 1);
5 ELSE
6 RETURN 1;
7 END IF;
8 END;
9 /

函数已创建。

SQL> CREATE OR REPLACE FUNCTION F_TEST_INLINE (P_IN IN NUMBER) RETURN NUMBER AS
2 BEGIN
3 IF P_IN > 1 THEN
4 PRAGMA INLINE (F_TEST_INLINE, 'YES');
5 RETURN P_IN F_TEST_INLINE(P_IN - 1);
6 ELSE
7 RETURN 1;
8 END IF;
9 END;
10 /

函数已创建。

分别建立两个递归调用的函数,一个使用了11g提供的PRAGMA INLINE,强制Oracle对函数F_TEST_INLINE进行INLINE优化,看看调用两个函数所需的时间:

SQL> SET TIMING ON
SQL> SELECT F_TEST_INLINE(1000000) FROM DUAL;

F_TEST_INLINE(1000000)
----------------------
5.0000E 11

已用时间: 00: 00: 01.32
SQL> SELECT F_TEST(1000000) FROM DUAL;

F_TEST(1000000)
---------------
5.0000E 11

已用时间: 00: 00: 18.68
SQL> SELECT F_TEST_INLINE(1000000) FROM DUAL;

F_TEST_INLINE(1000000)
----------------------
5.0000E 11

已用时间: 00: 00: 00.42
SQL> SELECT F_TEST(1000000) FROM DUAL;

IXDBA.NET技术社区

F_TEST(1000000)
---------------
5.0000E 11

已用时间: 00: 00: 00.57

无论是第一次调用,还是第二次调用,使用了INLINE的方法都比普通调用有一个明显的性能提升。

除了强制使用PRAGMA INLINE方法外,Oracle还提供了自动INLINE的方式,只需要将初始化参数PLSQL_OPTIMIZE_LEVLE设置为3Oracle会自动选择合适的过程进行INLINE优化:

SQL> SHOW PARAMETER PLSQL_OPTIMIZE_LEVEL

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
plsql_optimize_level integer 2
SQL> ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 3;

会话已更改。

SQL> CREATE OR REPLACE FUNCTION F_TEST (P_IN IN NUMBER) RETURN NUMBER AS
2 BEGIN
3 IF P_IN > 1 THEN
4 RETURN P_IN F_TEST(P_IN - 1);
5 ELSE
6 RETURN 1;
7 END IF;
8 END;
9 /

函数已创建。

SQL> SELECT F_TEST(1000000) FROM DUAL;

F_TEST(1000000)
---------------
5.0000E 11

已用时间: 00: 00: 00.40
SQL> SELECT F_TEST(1000000) FROM DUAL;

F_TEST(1000000)
---------------
5.0000E 11

已用时间: 00: 00: 00.46

可以看到设置了自动优化功能,F_TEST函数的调用也达到了PRAGMA INLINE函数的相同效果。需要说明的是,INLINE优化在大部分情况下会带来性能的提升,但是这个性能的提升是以占用更多的内存为代价的。下面看看两种方式的统计差别:

SQL> ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 2;

会话已更改。

SQL> CREATE OR REPLACE FUNCTION F_TEST (P_IN IN NUMBER) RETURN NUMBER AS
2 BEGIN
3 IF P_IN > 1 THEN
4 RETURN P_IN F_TEST(P_IN - 1);



阅读更多内容1 · 2 · 下一页>>


  上一篇: Oracle11新特性——PLSQL新特性(...   下一篇: Oracle11新特性——PLSQL新特性(...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL函数缓存...
·Oracle11新特性——PLSQL函数缓存...
·Oracle11新特性——PLSQL函数缓存...
·Oracle11新特性——行列转换语句...
·Oracle11新特性——SQL缓存结果集...
·Oracle11新特性——行列转换语句...
·Oracle11新特性——SQL缓存结果集...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11DATA GUARD实时应用加实...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接