`

PL/SQL中三种游标效率对比

 
阅读更多

 

这里对比下面三种格式游标循环效率

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最新中文手册

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种过程化语言,专为数据库操作设计。这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...

    oracle10g_pl/sql

    - **游标变量**:用于存储游标状态,可以在PL/SQL中传递和操作。 - **包**:将相关的过程、函数和变量打包在一起,便于管理和重用。 6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    在PL/SQL中,我们可以编写存储过程、函数、触发器、游标和异常处理等。这些组件对于数据库的业务逻辑处理至关重要,可以提高数据操作的安全性,减少网络通信,同时提高性能。 在"plsql_day02"这个压缩包文件中,很...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。 4. **记录类型**:定义和操作记录类型,用于处理动态或不确定的数据结构。 5. **集合类型**:包括数组(PLS_...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    在 PL/SQL 中,可以使用游标来处理查询结果,游标可以分为隐式游标和显式游标两种。隐式游标是 Oracle 自动生成的游标,而显式游标是用户定义的游标。 PL/SQL 处理流程包括过程、函数、触发器三种。过程是 PL/SQL ...

    Oracle PL/SQL程序设计(第5版)(上下册)

    #### 三、PL/SQL程序数据 - **变量与常量**:如何声明和使用变量及常量,包括局部变量和全局变量的区别。 - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **...

    PL/SQL 基本知识

    PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...

    pl/sql 学习资料

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程式编程的高级语言,主要用于数据库管理和应用程序开发。在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的...

    PL/SQL中用到的几种不同类型的游标写法(转)

    本篇文章将深入探讨PL/SQL中使用的几种不同类型的游标及其用法。 首先,我们有隐式游标。PL/SQL为每个SQL语句自动提供隐式游标,用户无需显式声明。当执行一个DML(数据操纵语言)语句如INSERT、UPDATE或DELETE时,...

    PL/SQL安装包

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL与过程编程的语言,用于在Oracle环境中开发数据库应用程序。PL代表Procedural Language,SQL则代表Structured Query Language。这个"PL/SQL安装包...

    PL/SQL入门到精通书的源代码

    12. **游标变量**:游标变量是PL/SQL中的一种特殊变量,可以直接存储查询结果,用于在程序中传递查询结果。 13. **PL/SQL与Oracle数据库对象**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引等...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    Oracle PL/SQL是一种强大的编程语言,它将数据库管理和应用程序逻辑紧密结合起来,是Oracle数据库系统中的核心组件之一。这本书“Oracle PL/SQL实例编程”显然旨在深入讲解如何利用PL/SQL进行实际开发工作,通过实例...

    PL/SQL编程基础知识

    在PL/SQL环境中可以使用的SQL语句主要包括以下几种: - **INSERT**:用于向表中插入新记录。 - **UPDATE**:用于更新现有记录。 - **DELETE**:用于删除表中的记录。 - **SELECT INTO**:用于从表中选取数据,并将...

    ORACLE PL/SQL从入门到精通

    循环语句是PL/SQL编程中用来重复执行一组语句的结构,包括loop、while、for三种形式,它们各自有不同的使用场景和语法。 分支条件语句在PL/SQL中用来根据不同的条件执行不同的代码分支,主要包括CASE表达式和if-...

    PL/SQL 详解

    它不仅可以直接在Oracle数据库服务器上执行,还可以在客户端工具中使用,这使得PL/SQL成为一种非常灵活且功能强大的编程工具。 ##### 1.2 PL/SQL的优点或特征 **1.2.1 有利于客户/服务器环境应用的运行** 在客户/...

    PL/SQL下载

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程编程的语言,专为数据库管理和应用程序开发设计。PL/SQL全称为“Procedural Language/Structured Query Language”,它提供了丰富的控制...

    PL/SQL中文帮助手册

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它集成了SQL语言的查询功能和过程性编程语言的控制结构,为数据库开发提供了强大的工具。这个"PL/SQL中文帮助手册"是7.0...

    Pl/Sql程序设计

    1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...

Global site tag (gtag.js) - Google Analytics