Sql 针对多连接的Oracle查询优化
以下查询花费的时间太长30秒。 我认为瓶颈在于where子句。有可能优化吗Sql 针对多连接的Oracle查询优化,sql,oracle,Sql,Oracle,以下查询花费的时间太长30秒。 我认为瓶颈在于where子句。有可能优化吗 SELECT COUNT(*) AS IN_HELP FROM HCM.TableA INNER JOIN HCM.EMPLOYEE_POSITION_BOX EPB ON TableA.POSITION_BOX_CODE = EPB.POSITION_BOX_CODE AND NVL (V_DATE,SYSDATE) BETWEEN EPB.EFFECTIVE_DATE AND EPB.
SELECT
COUNT(*) AS IN_HELP
FROM
HCM.TableA
INNER JOIN
HCM.EMPLOYEE_POSITION_BOX EPB
ON
TableA.POSITION_BOX_CODE = EPB.POSITION_BOX_CODE AND NVL (V_DATE,SYSDATE) BETWEEN EPB.EFFECTIVE_DATE AND EPB.END_DATE
LEFT OUTER JOIN
HCM.NODE_LEVEL_MASTER NLM
ON
HCM.F_EMPLOYEE_ACTUAL_NODE(EPB.EMPLOYEE_CODE,TRUNC(SYSDATE)) = NLM.NODE_NO
LEFT JOIN
HCM.POSITION_STATUS_MASTER PSM
ON
TableA.STATUS = PSM.POSITION_STATUS_NO
WHERE
NLM.NODE_NO_LEVEL2 = V_LOOP.NODE_NO_LEVEL2
AND HCM.F_EMPLOYEE_ACTUAL_NODE(EPB.EMPLOYEE_CODE,TRUNC (SYSDATE)) <> TableA.NODE_NO
AND PSM.FLAG = 'Y'
AND TableA.STATUS <> '0108'
首先,从WHERE子句检查表的索引: NLM.NODE\u NO\u LEVEL2 V_LOOP.NODE_NO_LEVEL2 表a.NODE_编号 表A.现状 不应将PSM.FLAG添加到索引中,因为它不会提供一些有效的筛选表中数据的功能
另外,我认为HCM.F_EMPLOYEE_ACTUAL_节点是一个函数,对吗?如果是这样,那么您应该考虑将它从WHERE子句中删除,因为执行计划不会检查内部查询,并且根本没有优化,这会导致性能问题。
主要问题是您的函数HCM.FYEngEffEnEngalAL节点。首先将函数调用移动到子查询epbx:
SELECT
COUNT(*) AS IN_HELP
FROM
HCM.TableA
INNER JOIN
(SELECT HCM.F_EMPLOYEE_ACTUAL_NODE(EPB.EMPLOYEE_CODE,TRUNC(SYSDATE)) node, epb.* from HCM.EMPLOYEE_POSITION_BOX EPB) epbx
ON
TableA.POSITION_BOX_CODE = EPBx.POSITION_BOX_CODE AND NVL (V_DATE,SYSDATE) BETWEEN EPBx.EFFECTIVE_DATE AND EPBx.END_DATE
LEFT OUTER JOIN
HCM.NODE_LEVEL_MASTER NLM
ON
epbx.node = NLM.NODE_NO
LEFT JOIN
HCM.POSITION_STATUS_MASTER PSM
ON
TableA.STATUS = PSM.POSITION_STATUS_NO
WHERE
NLM.NODE_NO_LEVEL2 = V_LOOP.NODE_NO_LEVEL2
AND epbx.node <> TableA.NODE_NO
AND PSM.FLAG = 'Y'
AND TableA.STATUS <> '0108'
然后使用explain plan检查您的查询是否有效编写。您真的希望WHERE子句中的例如PSM.FLAG='Y'吗?它使左连接的行为类似于常规的内部连接。如果确实需要左联接,请将外部表的条件移到ON子句中!优化的第一个工具=解释计划。请以文本形式提供解释计划,而不是以清晰易读的方式提供图像。通常,优化的第一个工具=解释计划。但在这里我们不知道这个函数。它有什么作用?这可能是最大的问题。还有其他问题,例如alias V_循环。查询完成了吗?谢谢。我已删除上述功能和用法。现在查询将在1.7秒内运行!