为啥打开游标后批量收集加快了抓取速度?
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 时间和运行时间的极端跳跃。为啥?可以做些啥来加快速度?