为啥打开游标后批量收集加快了抓取速度?

Posted

技术标签:

【中文标题】为啥打开游标后批量收集加快了抓取速度?【英文标题】:Why does bulk collect speed up the fetching after opening the cursor?为什么打开游标后批量收集加快了抓取速度? 【发布时间】:2016-11-27 07:14:42 【问题描述】:
SET SERVEROUTPUT ON
DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF bulk_collect_test%ROWTYPE;
  CURSOR C1 IS SELECT * FROM bulk_collect_test;
  l_tab    t_bulk_collect_test_tab := t_bulk_collect_test_tab();
  l_start  NUMBER;
BEGIN
  OPEN C1;
  FETCH C1 BULK COLLECT INTO t_bulk_collect_test_tab;
  CLOSE C1;
END;

问题是当我们打开游标时,所有的数据都是从数据库中取出到plsql内存中的。在 FETCH 操作之前,数据存在于 PLSQL 内存,所以上下文切换没有问题。这种fetch操作有什么用吗?

【问题讨论】:

不,打开游标不会从表中读取任何数据。通过 fetch 读取数据。 @WernfriedDomscheit open 语句有什么作用? OPEN 解析语句,创建执行计划并锁定记录(如果由'FOR UPDATE'指定) 【参考方案1】:

当您批量收集游标时,您将数据从 DB 带到一个数组中,向 db 发出一个请求,但是如果您在循环中获取每条记录,您的代码将 N 个请求发送到数据库以获取 plsql 的记录,因此它具有更好的性能。 如果你有一个巨大的结果集,你应该在批量收集之后使用'limit NUMBER_OF_RECORDS'来限制你想从数据库加载到pl/sql的记录数“见第9行以下代码"; 打开游标不会将任何数据加载到内存中,它只会创建指向结果集第一条记录的指针。

SET SERVEROUTPUT ON
DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF bulk_collect_test%ROWTYPE;
  CURSOR C1 IS SELECT * FROM bulk_collect_test;
  l_tab    t_bulk_collect_test_tab := t_bulk_collect_test_tab();
  l_start  NUMBER;
BEGIN
  OPEN C1;
  FETCH C1 BULK COLLECT INTO t_bulk_collect_test_tab limit 500;
  CLOSE C1;
END;

【讨论】:

以上是关于为啥打开游标后批量收集加快了抓取速度?的主要内容,如果未能解决你的问题,请参考以下文章

磁盘清理以后速度为啥会更慢?

IBM Mainframe Assembler 程序在添加 COBOL 调用后显示 CPU 时间和运行时间的极端跳跃。为啥?可以做些啥来加快速度?

为啥 Jest --runInBand 会加快测试速度?

为啥这个字典理解这么慢?请建议加快速度的方法

BurpSuite日志分析过滤工具,加快SqlMap进行批量扫描的速度

如何使用多个工作人员加快批量导入谷歌云数据存储的速度?