2017-05-03 55 views
0

我對SQL和一般編程相當陌生,我需要以下查詢方面的幫助。它執行幾個小時,並在超時/連接關閉時結束。幫助在Oracle中加入優化

我已經嘗試爲參與連接的所有表創建複合索引,但它似乎沒有任何幫助,這很奇怪。

這個查詢用來運行得很好,但是在向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

回答

0

我看不到解釋計劃,因爲我在工作和圖片被封鎖。不過,我有一個關於發生了什麼事的想法。

您的問題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   
+0

感謝您的回覆。然而,當我加了條件,WHERE子句我得到了以下錯誤: SQL錯誤:ORA-01652:無法通過128 SYSTEM表空間,延長臨時段 我該如何解決這個問題? – AnnaBea