2017-05-03 7 views
0

저는 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

답변

0

나는 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 

이것은 허용되지만 대용량 테이블 및/또는 많은 관절이있는 경우에는 perf 킬러입니다. 오라클의 옵티마이 저는 사용하기에 적합한 경로와 색인을 실제로 결정할 수 없으므로 이러한 종류의 항목을 싫어하므로 전체 표를 검색합니다.

언뜻보기에 나는 T3/A3 비교를 WHERE 절에서 움직일 것을 제안 했으므로 모든 연결이 발생한 후에 실행됩니다. 이로 인해 쿼리가 다른 것으로 바뀌고 예상 결과가 반환되거나 반환되지 않을 수도 있지만 시도해보십시오.

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 : 테이블 공간 SYSTEM에서 128 개의 임시 세그먼트를 확장 할 수 없습니다. 어떻게 해결할 수 있습니까? – AnnaBea