循环优化SQL选择查询

时间:2018-12-10 12:22:12

标签: sql oracle

我想在SQL过程循环中优化选择查询。该循环迭代大约10000次,而选择查询则花费大约10,000。每次迭代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 个答案:

答案 0 :(得分:2)

有很多解决方案

  1. 但是首先使用现代的显式联接。

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

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

代码:

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; 

答案 1 :(得分:0)

就像@LoztInSpace提到的那样,几乎可以肯定,您可以替换PL / SQL循环来迭代“约10,000次”以成为驱动查询。 IE:如果您需要对发布的查询中返回的每一行的结果做某件事,对于“做某事10,000次”中的每一行,这暗示着外部循环是另一个查询,那么请嵌套您的查询(好吧,Kedar的查询的版本)。

每次执行PL / SQL循环都必须调用SQL引擎,从而强制进行上下文切换。如果不是更多,那大概是30毫秒中的10毫秒。用关键字PL/SQL "nested loop"搜索https://asktom.oracle.com以获取示例。

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