Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 针对多连接的Oracle查询优化_Sql_Oracle - Fatal编程技术网

Sql 针对多连接的Oracle查询优化

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.

以下查询花费的时间太长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.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秒内运行!