网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle sqlplus语句编辑命令.
.关于临时段(temporary segment)的.
.Oracle数据库备份技术.
.从问题入手帮你解决Oracle杀死死.
.在Linux下的Oracle 用脚本建库实.
.正規表示法.
.关于oracle中大对象处理的一些方.
.Oracle 11g 500种新功能 着重商业.
.AIX下自动启动Oracle数据库与监听.
.利用iptables防火墙保护Oracle数.
.ORACLE内置函数大全.
.如何限制只有0组的用户可以su成r.
.保证Oracle数据库安全性的策略和.
.推荐:学习使用 Oracle触发器心得.
.Oracle9i 数据库管理实务讲座(五).
.轻松取得Oracle结构描述句法.
.Linux应用方案集锦.
.Oracle Forms Server Troublesho.
.Oracle学习手册:Oracle游标使用.
.[Oracle]数据库访问限制绕过漏洞.

批量绑定(bulk binds):FOR循环与FORALL的性能比较

发表日期:2008-2-9


  通常在SQL语句中给PL/SQL变量赋值叫做绑定(Binding),一次绑定一个完整的集合称为批量绑定(Bulk Binding)。
  
  批量绑定(Bulk binds)可以通过减少在PL/SQL和SQL引擎之间的上下文切换(context switches )提高了性能.
  
  批量绑定(Bulk binds)包括:
  
  (i) Input collections, use the FORALL statement,一般用来改善DML(INSERT、UPDATE和DELETE) 操作的性能
  
  (ii) Output collections, use BULK COLLECT clause,一般用来提高查询(SELECT)的性能
  
  FORALL的语法如下:
  
  FORALL index IN lower_bound..upper_bound sql_statement;
  
  下面是一个简单测试,用以说明FORALL与FOR循环的性能差异。
  SQL> drop table blktest;
  
  Table dropped.
  
  Elapsed: 00:00:00.13
  SQL>
  SQL> CREATE TABLE blktest (num NUMBER(20), name varchar2(50));
  
  Table created.
  
  Elapsed: 00:00:00.08
  SQL>
  SQL> CREATE OR REPLACE PROCEDURE bulktest
   2 IS
   3   TYPE numtab IS TABLE OF NUMBER (20)
   4    INDEX BY BINARY_INTEGER;
   5
   6   TYPE nametab IS TABLE OF VARCHAR2 (50)
   7    INDEX BY BINARY_INTEGER;
   8
   9   pnums  numtab;
   10   pnames  nametab;
   11   t1    NUMBER;
   12   t2    NUMBER;
   13   t3    NUMBER;
   14 BEGIN
   15   FOR j IN 1 .. 1000000
   16   LOOP
   17    pnums (j)     := j;
   18    pnames (j)    := 'Seq No. ' TO_CHAR (j);
   19   END LOOP;
   20
   21   SELECT DBMS_UTILITY.get_time
   22    INTO t1
   23    FROM DUAL;
   24
   25   FOR i IN 1 .. 1000000
   26   LOOP
   27    INSERT INTO blktest
   28       VALUES (pnums (i), pnames (i));
   29   END LOOP;
   30
   31   SELECT DBMS_UTILITY.get_time
   32    INTO t2
   33    FROM DUAL;
   34
   35   FORALL i IN 1 .. 1000000
   36    INSERT INTO blktest
   37       VALUES (pnums (i), pnames (i));
   38
   39   SELECT DBMS_UTILITY.get_time
   40    INTO t3
   41    FROM DUAL;
   42
   43   DBMS_OUTPUT.put_line ('Execution Time (hsecs)');
   44   DBMS_OUTPUT.put_line ('---------------------');
   45   DBMS_OUTPUT.put_line ('FOR loop: ' TO_CHAR (t2 - t1));
   46   DBMS_OUTPUT.put_line ('FORALL:  ' TO_CHAR (t3 - t2));
   47 END;
   48 /
  
  Procedure created.
  
  Elapsed: 00:00:01.46
  SQL> exec bulktest;
  Execution Time (hsecs)
  ---------------------
  FOR loop: 30361
  FORALL:  4792
  
  PL/SQL procedure sUCcessfully completed.
  
  Elapsed: 00:06:32.92
  
  我们可以看到FORALL较FOR循环性能大大提高。
上一篇:如何使用Oracle的Decode函数进行多值判断 人气:831
下一篇:tkprof和sql trace 人气:1061
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐