【问题标题】:Assistance with Join Optimization in Oracle协助 Oracle 中的连接优化
【发布时间】:2017-05-03 12:58:54
【问题描述】:

总的来说,我对 SQL 和编程还很陌生,我需要有关以下查询的帮助。它执行了几个小时,最终超时/连接关闭。

我已经尝试为连接中涉及的所有表创建复合索引,但它似乎根本没有帮助,这很奇怪。

这个查询过去运行得很好,但是在我向 Lods_F_D_O_Dlvr_Dtil 表的联接添加条件后开始出现挂起(这是注释行)。你建议我做些什么来提高性能?谢谢 :c)

Select 
        A1.Dcmt_Nmbr, 
        A3.Blng_Nmbr, 
        T5.Shpm_Nmbr, 
        T6.Splr_Code, 
        T6.Splr_Name, 
        A6.Cnpj_Cpf_Nmbr, 
        a7.cnpj_cpf_nmbr, 
        A5.ordr_rson_code
From Lods_F_D_F_Nota_Fisc A1
  Inner Join Lods_F_D_F_Nota_Fisc_Item A2 On A1.Dcmt_Nmbr = A2.Dcmt_Nmbr
  Inner Join Lods_F_D_F_Blng_Item A3      On A3.Blng_Nmbr = A2.Srce_Dcmt_Code
                                          And A3.Item_Nmbr = A2.Item_Nmbr 
  Inner Join Lods_F_D_S_Sles_Ordr_Item A4 On A4.Sles_Dcmt_Nmbr = A3.Sles_Dcmt_Nmbr
                                          And A4.Item_Nmbr = A3.Item_Dcmt_Sles
  Inner Join Lods_F_D_s_Sles_Ordr A5      on a5.sles_dcmt_nmbr = a4.sles_dcmt_nmbr
  inner Join Lods_F_D_O_Dlvr_Dtil T3      On T3.Sles_Dcmt_Nmbr=A4.Sles_Dcmt_Nmbr
                                          And T3.Item_Nmbr = A4.Item_Nmbr
                                          --AND T3.DLVR_NMBR=A3.DLVR_NMBR
  inner Join Lods_F_D_O_Dlvr T4           On T4.Dlvr_Nmbr=T3.Dlvr_Nmbr
  inner Join Lods_F_D_O_Shpm T5           On T5.Shpm_Nmbr=T4.Shpm_Nmbr
  Inner Join Lods_M_Plnt A6               On A6.Plnt_Code = A4.Plnt_Code
                                          And A6.End_Date is null
  Inner Join Lods_M_Cstm A7               On A7.Cstm_Code = A5.Cstm_Code
                                          and a7.end_date is null
  LEFT JOIN LODS_M_SPLR T6                ON T5.SPLR_CODE=T6.SPLR_CODE
                                          And T6.End_Date Is Null
group by 
        A1.Dcmt_Nmbr,
        A3.Blng_Nmbr,
        T5.Shpm_Nmbr,
        T6.Splr_Code,
        T6.Splr_Name,
        A6.Cnpj_Cpf_Nmbr,
        a7.cnpj_cpf_nmbr,
        A5.ordr_rson_code

这是执行计划:

https://i.stack.imgur.com/1KW9h.png

【问题讨论】:

    标签: oracle query-optimization inner-join


    【解决方案1】:

    我在工作时看不到 EXPLAIN PLAN 并且图像被阻止。但是,我对正在发生的事情有一点想法。

    您有问题的 JOIN 引用了多个表:T3、A3、A4。

      inner Join Lods_F_D_O_Dlvr_Dtil T3  On T3.Sles_Dcmt_Nmbr=A4.Sles_Dcmt_Nmbr
                                          And T3.Item_Nmbr = A4.Item_Nmbr
                                          AND T3.DLVR_NMBR=A3.DLVR_NMBR
    

    这是允许的,但在大桌子和/或像你一样有很多关节的情况下,这是一个性能杀手。 Oracle 的优化器讨厌这种东西,因为它无法真正确定要使用的正确路径和索引,因此最终会进行全表扫描。

    乍一看,我建议在 WHERE 子句中移动 T3/A3 比较,以便在所有关节发生后执行。这会将查询变成不同的东西,可能会或可能不会返回预期的结果,但试一试:

    Select 
            A1.Dcmt_Nmbr, 
            A3.Blng_Nmbr, 
            T5.Shpm_Nmbr, 
            T6.Splr_Code, 
            T6.Splr_Name, 
            A6.Cnpj_Cpf_Nmbr, 
            a7.cnpj_cpf_nmbr, 
            A5.ordr_rson_code
    From Lods_F_D_F_Nota_Fisc A1
      Inner Join Lods_F_D_F_Nota_Fisc_Item A2 On A1.Dcmt_Nmbr = A2.Dcmt_Nmbr
      Inner Join Lods_F_D_F_Blng_Item A3      On A3.Blng_Nmbr = A2.Srce_Dcmt_Code
                                              And A3.Item_Nmbr = A2.Item_Nmbr 
      Inner Join Lods_F_D_S_Sles_Ordr_Item A4 On A4.Sles_Dcmt_Nmbr = A3.Sles_Dcmt_Nmbr
                                              And A4.Item_Nmbr = A3.Item_Dcmt_Sles
      Inner Join Lods_F_D_s_Sles_Ordr A5      on a5.sles_dcmt_nmbr = a4.sles_dcmt_nmbr
      inner Join Lods_F_D_O_Dlvr_Dtil T3      On T3.Sles_Dcmt_Nmbr=A4.Sles_Dcmt_Nmbr
                                              And T3.Item_Nmbr = A4.Item_Nmbr
      inner Join Lods_F_D_O_Dlvr T4           On T4.Dlvr_Nmbr=T3.Dlvr_Nmbr
      inner Join Lods_F_D_O_Shpm T5           On T5.Shpm_Nmbr=T4.Shpm_Nmbr
      Inner Join Lods_M_Plnt A6               On A6.Plnt_Code = A4.Plnt_Code
                                              And A6.End_Date is null
      Inner Join Lods_M_Cstm A7               On A7.Cstm_Code = A5.Cstm_Code
                                              and a7.end_date is null
      LEFT JOIN LODS_M_SPLR T6                ON T5.SPLR_CODE=T6.SPLR_CODE
                                              And T6.End_Date Is Null
    
    WHERE T3.DLVR_NMBR=A3.DLVR_NMBR
    group by 
            A1.Dcmt_Nmbr,
            A3.Blng_Nmbr,
            T5.Shpm_Nmbr,
            T6.Splr_Code,
            T6.Splr_Name,
            A6.Cnpj_Cpf_Nmbr,
            a7.cnpj_cpf_nmbr,
            A5.ordr_rson_code           
    

    【讨论】:

    • 感谢您的回复。但是,当我将条件添加到 WHERE 子句时,出现以下错误: SQL 错误:ORA-01652:无法在表空间 SYSTEM 中将临时段扩展 128 我该如何解决?
    猜你喜欢
    • 2018-02-26
    • 2015-11-06
    • 1970-01-01
    • 2011-06-05
    • 2021-12-11
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多