我想在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);
答案 0 :(得分:2)
有很多解决方案
但是首先使用现代的显式联接。
您对列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;
答案 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 FORALL
和BULK COLLECT
以获得可能的改进。