在循环中优化SQL select查询

我想在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 years ago

正如@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 以获得可能的改进 .

2 years ago

有很多解决方案

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

  • 您对列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;