【问题标题】:Is a pl/sql refcursor meant to return few records only?pl/sql refcursor 是否意味着只返回很少的记录?
【发布时间】:2014-08-18 15:14:25
【问题描述】:

我有一个执行良好且经过调整的查询。我把它放在一个程序中。当我使用一组值从 SQL 执行查询以绑定其中使用的变量时,最多会在 3-4 秒内生成结果。

来自 refcursor 的相同结果集需要 2 多分钟才能给出结果。我知道可能需要时间的是游标的 OPEN FETCH 和 CLOSE。

我已经确认该过程中没有其他任何东西会消耗时间,因此排除了这种情况。

返回的记录数约为 9000+,这让我想到了一个问题 - 当记录集的大小超出某个限制时,引用游标是否不太适合?

RAM 大小有问题吗?我使用 TOAD 来执行查询和比较过程。是的,我已经去了最后一条记录,所以它不像查询只返回前几条。

还有什么办法可以提高 REFCURSOR 的速度?非常感谢任何帮助。

【问题讨论】:

  • 从程序中返回结果后,您将如何处理结果,TOAD 会显示它们吗?如果是这样,问题是否可能在于 TOAD 在呈现 refcursor 的结果时速度很慢?
  • @nineside 该过程只是显示记录。 TOAD 以及读取 JDBC 都需要很长时间来打印记录。直接执行相同的查询(没有过程)在 TOAD 和 JDBC 中都很快。
  • 您是否尝试过使用 TKPROF 查看时间都花在了哪里?您是否尝试过运行该过程但不渲染输出?
  • 向我们展示程序!

标签: oracle plsql sys-refcursor


【解决方案1】:

您是否使用 BULK COLLECT 一次抓取多行?

  OPEN c_cursor;
  LOOP
    FETCH c_cursor
    BULK COLLECT INTO l_tab LIMIT 1000; -- or no limit to fetch all at once
    for i in 1 .. l_tab.last loop
      -- process each row
    end loop;
    EXIT WHEN c_cursor%NOTFOUND;
  END LOOP
  CLOSE c_cursor;

【讨论】:

  • 这是一个 SQL 查询的 REF CURSOR,在单独执行时看起来非常快(没有 proc ref 游标)
  • @user2275460,我建议的是一种调整程序的方法。您应该尝试使用 BULK COLLECT 在每次提取时抓取一堆(或全部),而不是一次提取一行。
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
相关资源
最近更新 更多