Bulk绑定是如何提高性能的。有空再翻译吧。(from oracle)

转载 2006年06月02日 16:43:00

How Do Bulk Binds Improve Performance?

The assigning of values to PL/SQL variables in SQL statements is called binding. PL/SQL binding operations fall into three categories:

  • in-bind When a PL/SQL variable or host variable is stored in the database by an INSERT or UPDATE statement.
  • out-bind When a database value is assigned to a PL/SQL variable or a host variable by the RETURNING clause of an INSERT, UPDATE, or DELETE statement.
  • define When a database value is assigned to a PL/SQL variable or a host variable by a SELECT or FETCH statement.

A DML statement can transfer all the elements of a collection in a single operation, a process known as bulk binding. If the collection has 20 elements, bulk binding lets you perform the equivalent of 20 SELECT, INSERT, UPDATE, or DELETE statements using a single operation. This technique improves performance by minimizing the number of context switches between the PL/SQL and SQL engines. With bulk binds, entire collections, not just individual elements, are passed back and forth.

To do bulk binds with INSERT, UPDATE, and DELETE statements, you enclose the SQL statement within a PL/SQL FORALL statement.

To do bulk binds with SELECT statements, you include the BULK COLLECT clause in the SELECT statement instead of using INTO.

For full details of the syntax and restrictions for these statements, see "FORALL Statement" and "SELECT INTO Statement".

Example: Performing a Bulk Bind with DELETE

The following DELETE statement is sent to the SQL engine just once, even though it performs three DELETE operations:

DECLARE
   TYPE NumList IS VARRAY(20) OF NUMBER;
   depts NumList := NumList(10, 30, 70);  -- department numbers
BEGIN
   FORALL i IN depts.FIRST..depts.LAST
      DELETE FROM emp WHERE deptno = depts(i);
END;

Example: Performing a Bulk Bind with INSERT

In the example below, 5000 part numbers and names are loaded into index-by tables. All table elements are inserted into a database table twice: first using a FOR loop, then using a FORALL statement. The FORALL version is much faster.

SQL> SET SERVEROUTPUT ON
SQL> CREATE TABLE parts (pnum NUMBER(4), pname CHAR(15));

Table created.

SQL> GET test.sql
 1  DECLARE
 2     TYPE NumTab IS TABLE OF NUMBER(4) INDEX BY BINARY_INTEGER;
 3     TYPE NameTab IS TABLE OF CHAR(15) INDEX BY BINARY_INTEGER;
 4     pnums  NumTab;
 5     pnames NameTab;
 6     t1 NUMBER(5);
 7     t2 NUMBER(5);
 8     t3 NUMBER(5);
 9     
10     
11  BEGIN
12     FOR j IN 1..5000 LOOP  -- load index-by tables
13        pnums(j) := j;
14        pnames(j) := 'Part No. ' || TO_CHAR(j); 
15     END LOOP;
16     t1 := dbms_utility.get_time;
17     FOR i IN 1..5000 LOOP  -- use FOR loop
18        INSERT INTO parts VALUES (pnums(i), pnames(i));
19     END LOOP;
20     t2 := dbms_utility.get_time;
21     FORALL i IN 1..5000  -- use FORALL statement
22        INSERT INTO parts VALUES (pnums(i), pnames(i));
23     get_time(t3);
24     dbms_output.put_line('Execution Time (secs)');
25     dbms_output.put_line('---------------------');
26     dbms_output.put_line('FOR loop: ' || TO_CHAR(t2 - t1));
27     dbms_output.put_line('FORALL:   ' || TO_CHAR(t3 - t2));
28* END;
SQL> /
Execution Time (secs)
---------------------
FOR loop: 32
FORALL:   3

PL/SQL procedure successfully completed.

Oracle Bulk 与 性能优化 说明

一. Bulk 概述        本来只想测试一下Bulk Collect 和update性能的,但发现Bulk 的东西还是很多的,在OTN上搜了一些,整理如下。   1.1 Bulk Bin...
  • xujinyang
  • xujinyang
  • 2011年09月26日 17:52
  • 876

使用bulk collect 和 forall 提高游标性能

当运行一个pl/sql程序时, pl/sql语句引擎会执行pl/sql语句。但如果在这个过程中引擎遇到sql语句,它会把这个语句传给sql引擎(后台发生上下文切换)。   在PL/SQL 和SQL引擎...
  • zj0078
  • zj0078
  • 2013年12月19日 08:47
  • 3221

oracle提高查询性能的方法

1、选择最有效率的表名顺序  (只在基于规则的优化器中有效):   ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table) ...
  • luxideyao
  • luxideyao
  • 2013年11月19日 08:09
  • 6120

几个简单的步骤大幅提高Oracle性能--我优化数据库的三板斧

                                   几个简单的步骤大幅提高Oracle性能--我优化数据库的三板斧  数据库优化的讨论可以说是一个永恒的主题。资深的Oracle优化人...
  • fishinhouse
  • fishinhouse
  • 2006年09月14日 22:08
  • 1319

在ORACLE下编写性能好的存储过程的一些经验

1、代码的清晰性是第一步的,代码应该整齐、缩进一致、注释充分。    PL/SQL DEV这个工具里面提供了代码格式化的工具:点击Edit菜单,点击“PL/SQL Beautifier”,工具会自动为...
  • zhouya10099
  • zhouya10099
  • 2010年03月25日 10:24
  • 299

如何最大限度提高.NET的性能

优化 .NET的性能1)避免使用ArrayList。     因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用...
  • 21aspnet
  • 21aspnet
  • 2007年03月21日 00:51
  • 7583

提高MySQL性能的7个技巧

原文:7 keys to better MySQL performance 作者:Peter Zaitsev 译者:Peter 译者注: 随着尺寸和负载的增长,MySQL的性能会趋于下降。...
  • dev_csdn
  • dev_csdn
  • 2017年11月02日 14:19
  • 20253

如何最大限度提高.NET的性能 (续)

其实随着硬件的发展,现在硬件的速度已经远远满足大多数人的的需要了,甚至有些人提出算法在现在软件开发中越来越不起作用了。记得以前看过麻省的数据结构视频,讲课的教授就问过一个问题(我记得不大清楚了,他的大...
  • kybd2006
  • kybd2006
  • 2007年11月10日 18:34
  • 505

如何提高数据库性能

一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分...
  • wulove52
  • wulove52
  • 2016年09月06日 21:56
  • 2856

Oracle 使用with要小心了--谓词不能推进

今天看到一条SQL大量使用了with,开发人员为了逻辑清晰,把一些结果集先用with缓存起来,后面还有很多地方用到这个结果集,原始的SQL需要执行2个多小时。优化方法是将把最先缓存的SQL放到用的地方...
  • guogang83
  • guogang83
  • 2014年11月20日 19:31
  • 1298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bulk绑定是如何提高性能的。有空再翻译吧。(from oracle)
举报原因:
原因补充:

(最多只允许输入30个字)