xsb Oracle Blog

暂无签名

  • 博客访问: 3064900
  • 博文数量: 343
  • 用 户 组: 普通用户
  • 注册时间: 1970-01-01 08:00
个人简介

鏆傛棤浠嬬粛

文章分类

全部博文(343)

文章存档

2012年(1)

2011年(6)

2010年(2)

2009年(6)

2008年(32)

2007年(28)

2006年(182)

2005年(78)

2004年(8)

分类: IT综合技术

2008-12-09 14:29:55

批量绑定(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)的性能
10g开始forall语句可以使用三种方式:
i in low..up
i in indices of collection 取得集合元素下标的值
i in values of collection 取得集合元素的值
forall语句还可以使用部分集合元素

sql%bulk_rowcount(i)表示forall语句第i元素所作用的行数

[@more@]

bulk collect 语句:
用于取得批量数据,只适用于select into ,fetch into 及DML语句的返回子句
DECLARE
TYPE type_emp IS TABLE OF scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;
tab_emp type_emp;

TYPE type_ename IS TABLE OF scott.emp.ename%TYPE INDEX BY BINARY_INTEGER;
tab_ename type_ename;
CURSOR c IS
SELECT *
FROM scott.emp;
BEGIN
SELECT * BULK COLLECT
INTO tab_emp
FROM scott.emp;
FOR i IN 1 .. tab_emp.COUNT LOOP
dbms_output.put_line(tab_emp(i).ename);
END LOOP;

dbms_output.new_line;
DELETE scott.emp RETURNING ename BULK COLLECT INTO tab_ename;
FOR i IN 1 .. tab_emp.COUNT LOOP
dbms_output.put_line(tab_emp(i).ename);
END LOOP;
ROLLBACK;

OPEN c;
FETCH c BULK COLLECT
INTO tab_emp;
dbms_output.new_line;
FOR i IN 1 .. tab_emp.COUNT LOOP
dbms_output.put_line(tab_emp(i).sal);
END LOOP;

END;

--测试用例:

--drop table blktest;
--CREATE TABLE blktest (num NUMBER(20), name varchar2(50));
--CREATE OR REPLACE PROCEDURE p_bulktest IS
DECLARE
TYPE type_num IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE type_name IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
tab_num type_num;
tab_name type_name;
t1 NUMBER;
t2 NUMBER;
t3 NUMBER;

BEGIN
FOR i IN 1 .. 500000 LOOP
tab_num(i) := i;
tab_name(i) := 'name: ' || to_char(i);
END LOOP;

t1 := dbms_utility.get_time;

FOR i IN 1 .. 500000 LOOP
INSERT INTO blktest VALUES (tab_num(i), tab_name(i));
END LOOP;

t2 := dbms_utility.get_time;

FORALL i IN 1 .. 500000
INSERT INTO blktest VALUES (tab_num(i), tab_name(i));

t3 := dbms_utility.get_time;

dbms_output.put_line('Execution Time(S)');
dbms_output.put_line('-------------------');
dbms_output.put_line('FOR loop: ' || to_char((t2 - t1) / 100));
dbms_output.put_line('FORALL:  ' || to_char((t3 - t2) / 100));

END;
/
Execution Time(S)
-------------------
FOR loop: 32.78
FORALL: 2.64

阅读(3171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册