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 in
和 not 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'
我有一个 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 in
和 not 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'