是否更快地返回游标?

时间:2011-06-22 01:57:07

标签: sql oracle

使用存储过程时,将光标返回更快?或者使用数据类型的out数据参数更快。 或者它确实没有任何性能差异。

PROCEDURE SPUSINGCURSOR ( input1 INT,
                          retcursor out sys_refcursor ) IS
BEGIN

  OPEN retcursor FOR
    SELECT var1,
           var2,
           var3
      FROM Table_Vlaues
     WHERE var1 = input1
  ORDER BY var1;

END;

1 个答案:

答案 0 :(得分:7)

这取决于很多事情。

如果在SP中执行查询并返回包含结果的嵌套表类型,则SP将花费时间运行并消耗保存数据所需的内存。它还需要一次性将所有数据发送回客户端,这将花费一些时间。但是如果你需要在继续做其他事情之前访问所有数据,并且内存要求不是太大,这是一种合理的做事方式。

如果您改为打开并返回REF CURSOR,则实际SP执行时间和所需内存将减少;但是当你从光标中取出时,你只是将执行时间推迟到以后。如果很有可能你不需要获取所有行;或者数据集可能非常大;或者如果以小批量获取行允许您在中间执行一些其他有意义的工作(例如将它们传递给另一个线程或实际上会对它们执行某些操作的进程),那么这可能是一种更好的方法。返回光标的主要缺点是从中获取光标可能需要更多的网络往返,这可能比仅仅一次返回数据更慢。

返回开放REF CURSOR的非性能优势是它在某些客户端环境中更容易使用(例如,在JDBC中它直接映射到ResultSet,而对于嵌套表类型,您需要执行额外的工作为Java提供类型信息。)