这里对比下面三种格式游标循环效率
1.单条处理 OPEN 游标; LOOP FETCH 游标 INTO 变量; EXIT WHEN 条件; END LOOP; CLOSE 游标; 2.批量处理 OPEN 游标; FETCH 游标 BULK COLLECT INTO 集合变量; CLOSE 游标; 3.隐式游标; FOR X IN (SQL语句) LOOP ... END LOOP;
现在进行测试
SQL> set timing on; //设置打印执行时间 SQL> create table big_data as select level a,'b' b from dual connect by level<=2000000; //创建表big_data并插入2000000条数据 表已创建。 已用时间: 00: 00: 00.82 SQL> declare 2 cursor c_big is 3 select * from big_data; 4 v_big c_big%rowtype; 5 begin 6 open c_big; 7 loop 8 fetch c_big into v_big; 9 exit when c_big%notfound; 10 end loop; 11 close c_big; 12 end; 13 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 07.30 SQL> declare 2 cursor c_big is 3 select * from big_data; 4 type t_big is table of c_big%rowtype index by pls_integer; 5 v_big t_big; 6 begin 7 open c_big; 8 loop 9 exit when c_big%notfound; 10 fetch c_big bulk collect into v_big limit 10000; 11 end loop; 12 close c_big; 13 end; 14 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 00.38 SQL> declare 2 v_big big_data%rowtype; 3 begin 4 for x in (select * from big_data) loop 5 v_big := x; 6 end loop; 7 end; 8 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 00.57 //可以看到三种游标遍历中第一种最耗时,只是遍历什么处理都没做就耗费了7秒多时间,因为它要fetch2000000次,而第二种批量获取 //这里设置每次获取10000条,也就获取200次,隐式获取其实获取每次获取多条数据 SQL> create table new_data as select * from big_data where 1=2; //使用这个sql语句创建一个跟big_data表结构一样的表new_data,这样的建表方式只复制表结构,其他像主键、注释什么都不复制 表已创建。 已用时间: 00: 00: 00.00 //下面是给每种游标遍历加上一个插入表记录的操作 SQL> declare 2 cursor c_big is 3 select * from big_data; 4 v_big c_big%rowtype; 5 begin 6 open c_big; 7 loop 8 fetch c_big into v_big; 9 exit when c_big%notfound; 10 insert /*+append*/ into new_data nologging (a,b) values(v_big.a,v_big.b); 11 end loop; 12 close c_big; 13 end; 14 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 35.46 SQL> truncate table new_data; 表被截断。 已用时间: 00: 00: 00.86 SQL> declare 2 cursor c_big is 3 select * from big_data; 4 type t_big is table of c_big%rowtype index by pls_integer; 5 v_big t_big; 6 begin 7 open c_big; 8 loop 9 exit when c_big%notfound; 10 fetch c_big bulk collect into v_big limit 100000; 11 begin 12 forall i in 1 .. v_big.count 13 insert /*+append*/ into new_data nologging (a,b) values(v_big(i).a,v_big(i).b); 14 end; 15 end loop; 16 close c_big; 17 end; 18 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 01.83 SQL> truncate table new_data; 表被截断。 已用时间: 00: 00: 00.77 SQL> begin 2 for x in(select * from big_data) loop 3 insert /*+append*/ into new_data nologging (a,b) values(x.a,x.b); 4 end loop; 5 end; 6 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 31.11 //可以看到这个差距就明显了,批量获取的游标方式只需要不到2秒钟,而单条获取和隐式游标都需要30几秒 //我们分析一下,因为获取次数过多而产生的时间差是固定的,因而这相差的30秒应该是因为插入语句执行次数 //而产生的差距,也就是说同意的插入语句、同样的数据,每次获取数量不同进行处理效率也会发生很大差距, //也许换一种不受处理数量影响的操作语句,他们相差的时间还会是7秒左右 SQL> spool off
相关推荐
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种过程化语言,专为数据库操作设计。这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册...
PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...
- **游标变量**:用于存储游标状态,可以在PL/SQL中传递和操作。 - **包**:将相关的过程、函数和变量打包在一起,便于管理和重用。 6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...
循环语句是PL/SQL编程中用来重复执行一组语句的结构,包括loop、while、for三种形式,它们各自有不同的使用场景和语法。 分支条件语句在PL/SQL中用来根据不同的条件执行不同的代码分支,主要包括CASE表达式和if-...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...
3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。 4. **记录类型**:定义和操作记录类型,用于处理动态或不确定的数据结构。 5. **集合类型**:包括数组(PLS_...
在 PL/SQL 中,可以使用游标来处理查询结果,游标可以分为隐式游标和显式游标两种。隐式游标是 Oracle 自动生成的游标,而显式游标是用户定义的游标。 PL/SQL 处理流程包括过程、函数、触发器三种。过程是 PL/SQL ...
#### 三、PL/SQL程序数据 - **变量与常量**:如何声明和使用变量及常量,包括局部变量和全局变量的区别。 - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **...
PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程式编程的高级语言,主要用于数据库管理和应用程序开发。在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的...
本篇文章将深入探讨PL/SQL中使用的几种不同类型的游标及其用法。 首先,我们有隐式游标。PL/SQL为每个SQL语句自动提供隐式游标,用户无需显式声明。当执行一个DML(数据操纵语言)语句如INSERT、UPDATE或DELETE时,...
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL与过程编程的语言,用于在Oracle环境中开发数据库应用程序。PL代表Procedural Language,SQL则代表Structured Query Language。这个"PL/SQL安装包...
Oracle PL/SQL是一种强大的编程语言,它将数据库管理和应用程序逻辑紧密结合起来,是Oracle数据库系统中的核心组件之一。这本书“Oracle PL/SQL实例编程”显然旨在深入讲解如何利用PL/SQL进行实际开发工作,通过实例...
12. **游标变量**:游标变量是PL/SQL中的一种特殊变量,可以直接存储查询结果,用于在程序中传递查询结果。 13. **PL/SQL与Oracle数据库对象**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引等...
在PL/SQL环境中可以使用的SQL语句主要包括以下几种: - **INSERT**:用于向表中插入新记录。 - **UPDATE**:用于更新现有记录。 - **DELETE**:用于删除表中的记录。 - **SELECT INTO**:用于从表中选取数据,并将...
它不仅可以直接在Oracle数据库服务器上执行,还可以在客户端工具中使用,这使得PL/SQL成为一种非常灵活且功能强大的编程工具。 ##### 1.2 PL/SQL的优点或特征 **1.2.1 有利于客户/服务器环境应用的运行** 在客户/...
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程编程的语言,专为数据库管理和应用程序开发设计。PL/SQL全称为“Procedural Language/Structured Query Language”,它提供了丰富的控制...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它集成了SQL语言的查询功能和过程性编程语言的控制结构,为数据库开发提供了强大的工具。这个"PL/SQL中文帮助手册"是7.0...
1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...