【问题标题】:ORA-02395: exceeded call limit on IO usage and using cursors as alternativeORA-02395: 超出了 IO 使用的调用限制并使用游标作为替代
【发布时间】:2020-06-19 05:08:57
【问题描述】:

我有一个包含MINUS 的 PLSQL 查询。

 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 INTOtable OF *** 的游标可以获取的最大行数是多少。

【问题讨论】:

    标签: oracle plsql oracle11g database-cursor


    【解决方案1】:

    你可以试试这个:

    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'
    

    【讨论】:

      【解决方案2】:

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

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

      如果不查看您的整个程序,很难为您的个人资料限制提供解决方法。

      【讨论】:

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