在循环中优化SQL select查询

loading...


1

我想在SQL过程的循环中优化选择查询 . 循环迭代大约10000次,选择查询大约需要 . 每次迭代30 ms,这会增加过程的总执行时间

SELECT *
FROM BANKACCOUNTS B,
     MAPPING M,
     UPL_DTR_UPLOAD UP,
     (SELECT * FROM MAPPING WHERE SOURCE = 'KARVY_BANK_CODE') M1
 WHERE B.SCHEME_CODE = M.INTERNALCODE
   AND M1.INTERNALCODE = B.BANK_CODE
   AND M.SOURCE        = 'R0'
   AND B.AC_TYPE       = 'FUNDING'
   AND M.EXTERNALCODE IS NOT NULL
   AND UPPER(TRIM(M.EXTERNALCODE || M1.EXTERNALCODE || B.AC_NO)) =
           Upper(UP.Scheme || UP.Fundingbnk || UP.fundingacc);
2回答

  • 2

    正如@LoztInSpace所提到的,你几乎可以肯定地取代你的PL / SQL循环来迭代“大约10,000次”以成为驱动查询 . IE:如果你需要对你发布的查询中返回的每一行的结果做一些事情,对于“做一些约10,000次”的每一行,暗示外观是另一个查询,然后嵌套你的查询(好吧,Kedar的你的外部循环内部的查询版本 .

    每次执行PL / SQL循环都必须调用SQL引擎,强制进行上下文切换;如果不是更多的话,这可能是30毫秒的30毫秒 . 例如,使用关键字 PL/SQL "nested loop" 搜索https://asktom.oracle.com .

    您还可以查看PL/SQL bulk processing statements FORALLBULK COLLECT 以获得可能的改进 .


  • 0

    有很多解决方案

    • 但首先使用现代的显式连接 .

    • 您对列m1的查询包含 * ,仅使用必填列

    • 检查说明计划和索引的使用

    码:

    SELECT * 
    FROM bankaccounts B 
    JOIN mapping M ON B.scheme_code = M.internalcode 
    JOIN 
        (SELECT internalcode, externalcode
         FROM mapping 
         WHERE source = 'KARVY_BANK_CODE') M1 ON M1.internalcode = B.bank_code 
    JOIN upl_dtr_upload UP ON UPPER(TRIM(M.externalcode || M1.externalcode || B.ac_no)) = UPPER(UP.scheme || UP.fundingbnk || UP.fundingacc) 
    WHERE  
        M.source = 'R0' 
        AND B.ac_type = 'FUNDING' 
        AND M.externalcode IS NOT NULL;
    
评论

loading...

暂时没有评论!