ORA-02395: 超出了 IO 使用的调用限制并使用游标作为替代

ORA-02395: exceeded call limit on IO usage and using cursors as alternative

我有一个 PLSQL 查询 MINUS.

 select id from small_table where col ='xxx' 
     MINUS 
select id from large_table;

large_table 有 139070 行,small_table 有 7459 行。执行时我得到 ORA-02395: exceeded call limit on IO usage 。我试过用 not innot exists 替换 MINUS。我已阅读有关该错误的信息,但我无法与 DBA 协商更改 LOGICAL_READS_PER_CALL。现在,我可以使用 2 个游标从 2 个表中获取数据,然后在 PLSQL 端执行 MINUS 等效逻辑吗?或者即使使用游标逻辑我也会得到 ORA-02395 。或者我可以重写查询本身?

此外,使用 BULK COLLECT INTO a table OF ***.

游标可以获取的最大行数是多少

如果显而易见的解决方案(与您的 DBA 协商)不可行,您将需要重构查询以减少它扫描的块数。这样做需要了解您的数据量和分布。该程序是在生产系统中运行的软件的一部分吗?您的用户有一个配置文件资源限制,以避免您可以克服系统资源。你的 dba 给你什么解释拒绝你的请求?

您可以使用带有 LIMIT 子句的 BULK COLLECT INTO。该子句限制了行数,但是这种技术甚至更消耗资源。所以我不相信它会起作用。

如果没有看到您的整个程序,很难为您的配置文件限制提供解决方法。

你可以试试这个:

select s.id
from small_table s
left join big_table b
on s.id = b.id
where b.id is null
and s.col = 'xxx'