打开光标后,为什么批量收集会加快提取速度?

时间:2016-11-27 07:14:43

标签: sql oracle performance plsql

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内存所以上下文切换没有问题。有没有使用这种获取操作?

1 个答案:

答案 0 :(得分:0)

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

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;