2017-05-03 10 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

私はEXPLAIN PLANを見ることはできません。しかし、私は何が起こっているのlitlleのアイデアを持っています。

問題のある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 

これは許可されていますが、大きなテーブルではパーフェクトキラーであり、あなたのような多くのジョイントがあります。オラクルのオプティマイザは、使用する正しいパスと索引を実際に決定することができず、したがってフル・テーブルのスキャンに終わるので、この種のものは嫌です。

一見すると、私は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