【问题标题】: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'指定)

标签: sql oracle performance plsql


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多