2016-03-29 9 views
0

私は次のクエリを持っています。このクエリでは、header_idを持つカスタムテーブルを使用してebsテーブルを選択し、カスタムテーブルXXREPORT_L1_TBLにデータを設定しています。長いクエリチューニング

このクエリを調整します。

[更新]は蛇腹のようにクエリを変更した:

  1. は、3つの異なる挿入文
  2. でクエリが値
  3. の行クエリで行う列が更新ステートメントを追加、削除splitedこれらの列の最後に表示されます。

    insert into XX.XXREPORT_L1_TBL (ORDER_NUMBER 
                 , LINE_NUMBER 
                 , UOM 
                 , CUSTOMER_LENGTH 
                 , THEORETICAL_WEIGHT 
                 , FINISH 
                 , ORDER_QTY_PCS 
                 , ORDER_QTY_KGS 
                 , SALES_VALUE 
                 , TOTAL_VALUE 
                 , ORDERED_QUANTITY 
                 , WIP_ENTITY_ID 
                 , JOB_NAME 
                 , JOB_TYPE 
                 , JOB_STATUS 
                 , JOB_RELEASED_DATE 
                 , DATE_COMPLETED 
                 , DATE_CLOSED 
                 , JOB_CARD_QTY 
                 , ALLOY 
                 , PROFILE 
                 , PROD_QTY_KGS 
                 , COST_KGS_THEORY 
                 , COST_KGS_ACTUAL 
        ) 
    
    SELECT 
    ---- Sales Order 
        xx.order_number 
        ,xx.line_number 
        ,xx.UOM, 
        xx.customer_length, 
        xx.theoretical_weight, 
        xx.finish, 
        xx.order_qty_pcs, 
        xx.order_qty_kgs,  
        xx.sales_value, -- total value/total kgs 
        xx.total_value, -- line total 
        xx.ordered_quantity, 
    -- Production 
        xx.wip_entity_id, 
        xx.job_name, 
        (select case when a.inventory_item_id = 5716770 and a.job_type='NOT CHILD' then 'PARENT' 
          when a.job_type='CHILD' and a.inventory_item_id is null then 'CHILD' 
          when a.job_type='NOT CHILD' and a.inventory_item_id is NOT null then 'NOT CHILD' END JOB_TYPE 
        from (select disc2.wip_entity_id as wip_entity_id,  decode  (  nvl(disc2.attribute9,-1) , -1,'NOT CHILD', 'CHILD') job_type,  oel.inventory_item_id 
            from APPS.wip_discrete_jobs disc2,  APPS.oe_order_lines_all oel 
            where oel.line_id(+) = disc2.source_line_id 
          )a 
        where a.wip_entity_id = xx.wip_entity_id 
        ) job_type, 
        (select decode (xx.status_type, 6, 'Open', 
                3, 'Open', 
                4,  'Completed',           
                LU1.MEANING) 
          from APPS.FND_LOOKUP_VALUES LU1 
          where LU1.LOOKUP_TYPE = 'WIP_JOB_STATUS' 
          AND LU1.LOOKUP_CODE = xx.STATUS_TYPE 
        ) job_status,  
        xx.job_released_date, 
        xx.date_completed, 
        xx.date_closed 
        ,xx.net_quantity as job_card_qty 
        ,xx.alloy 
        ,xx.profile 
        ,xx.prod_qty_kgs  
        -- Theoretical Order cost 
        ,xx.cost_kgs_theory 
        -- Actual Order cost  
        ,xx.cost_kgs_actual 
        from (  
         select a.* 
        -- Theoretical Order cost 
          , DECODE (a.qty_completed * a.customer_length * a.theoretical_weight,0,0, 
           a.TOT_THEORY_COST_RELIEVED/(a.qty_completed * a.customer_length * a.theoretical_weight)) as cost_kgs_theory 
        -- Actual Order cost 
          , DECODE (a.qty_completed * a.customer_length * a.theoretical_weight, 0, 0, 
           a.TOT_ACTUAL_COST_INCURRED/(a.qty_completed * a.customer_length * a.theoretical_weight)) as cost_kgs_actual 
          from ( 
    
        select 
    -- Normal orders, INTERNAL Orders, Crimped Profile (parent jobs)  
        -- Sales Order  
         oeh.order_number as order_number 
         ,oel.line_number 
         ,oel.pricing_quantity_uom as UOM 
         ,oel.attribute1 as customer_length 
         ,oel.attribute6 as theoretical_weight 
         ,oel.attribute5 as finish 
         ,oel.attribute18 as order_qty_pcs 
         ,oel.attribute7 as order_qty_kgs 
         ,xx_om.GetLineUnitSellingPrice(oel.line_id) sales_value 
         ,xx_om.GetHeaderUnitSellingPrice(oeh.header_id) total_value 
         ,oel.ordered_quantity ordered_quantity 
    -- Production     
         , tbl0.qty_completed as qty_completed 
         ,disc.wip_entity_id as wip_entity_id 
         ,(select wip_entity_name from APPS.wip_entities ent 
          where ent.wip_entity_id = disc.wip_entity_id) job_name 
         ,disc.status_type 
         ,disc.date_released as job_released_date 
         , DECODE (disc.date_completed, NULL, disc.date_completed, 
         -- my day Definition 
         to_date(to_char(to_date(TO_CHAR(disc.date_completed-  interval  '7' hour,'DD-MON-YYYY')||'00:00:00','DD-MON-YYYY HH24:MI:SS'),  'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY  HH24:MI:SS'))  as  date_completed 
         , DECODE (disc.date_closed, NULL, disc.date_closed, 
         to_date(to_char(to_date(TO_CHAR(disc.date_closed-  interval  '7' hour,'DD-MON-YYYY')||'00:00:00','DD-MON-YYYY HH24:MI:SS'),  'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS'))  as  date_closed 
         , disc.net_quantity 
        , (select opr2.quantity_completed 
         from APPS.wip_operations opr2 
        where opr2.wip_entity_id = disc.wip_entity_id 
        and opr2.operation_seq_num =  (select max(opr.operation_seq_num) 
                 from APPS.wip_operations opr, APPS.wip_discrete_jobs disc2 
                 where opr.wip_entity_id = disc2.wip_entity_id 
                 and disc2.wip_entity_id = disc.wip_entity_id))* oel.attribute1 * oel.attribute6 as prod_qty_kgs 
         ,oel.attribute4 as alloy 
         ,oel.attribute2 as profile 
    
    -- Theoretical Order cost 
          ,tbl0.TOT_THEORY_COST_RELIEVED 
    -- Actual Order cost 
          ,tbl0.TOT_ACTUAL_COST_INCURRED 
    from XX.XXREPORT_Lzero_TBL tbl0 
    join APPS.oe_order_headers_all oeh on oeh.header_id = tbl0.header_id 
    join APPS.oe_order_lines_all oel on oeh.org_id = oel.org_id and  oeh.header_id = oel.header_id 
    join APPS.xx_assemblies asm on oel.line_id = asm.line_id 
    join APPS.wip_discrete_jobs disc on disc.primary_item_id = asm.inventory_item_id 
        where oel.link_to_line_id is null 
    
    union 
    -- Crimped Child Jobs 
        select 
    -- Sales Order  
         oeh.order_number as order_number 
         ,oel.line_number 
         ,oel.pricing_quantity_uom as UOM 
         ,oel.attribute1 as customer_length 
         ,oel.attribute6 as theoretical_weight 
         ,oel.attribute5 as finish 
         ,oel.attribute18 as order_qty_pcs 
         ,oel.attribute7 as order_qty_kgs 
         ,xx_om.GetLineUnitSellingPrice(oel.line_id) sales_value 
         ,xx_om.GetHeaderUnitSellingPrice(oeh.header_id) total_value 
         ,oel.ordered_quantity ordered_quantity 
    -- Production 
         , tbl0.qty_completed as qty_completed 
         ,child_jobs.wip_entity_id as wip_entity_id 
         ,(select wip_entity_name from APPS.wip_entities ent 
          where ent.wip_entity_id = child_jobs.wip_entity_id)   job_name 
         ,disc.status_type 
         ,disc.date_released as job_released_date 
         , DECODE (disc.date_completed, NULL, disc.date_completed, 
         to_date(to_char(to_date(TO_CHAR(disc.date_completed-interval  '7' hour,'DD-MON-YYYY')||'00:00:00','DD-MON-YYYY HH24:MI:SS'),  'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS')) as  date_completed 
         , DECODE (disc.date_closed, NULL, disc.date_closed, 
         to_date(to_char(to_date(TO_CHAR(disc.date_closed-interval  '7' hour,'DD-MON-YYYY')||'00:00:00','DD-MON-YYYY HH24:MI:SS'),  'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS')) as  date_closed 
         , disc.net_quantity 
         , (select opr2.quantity_completed 
           from APPS.wip_operations opr2 
           where opr2.wip_entity_id = disc.wip_entity_id 
           and opr2.operation_seq_num =  (select   max(opr.operation_seq_num) 
                   from  APPS.wip_operations opr, APPS.wip_discrete_jobs disc2 
                   where opr.wip_entity_id = disc2.wip_entity_id 
                   and disc.wip_entity_id = disc.wip_entity_id))* oel.attribute1 * oel.attribute6 as prod_qty_kgs     
         ,oel.attribute4 as alloy 
         ,oel.attribute2 as profile 
    -- Theoretical Order cost 
          ,tbl0.TOT_THEORY_COST_RELIEVED 
    -- Actual Order cost 
          ,tbl0.TOT_ACTUAL_COST_INCURRED  
    from XX.XXREPORT_Lzero_TBL tbl0 
    join APPS.oe_order_headers_all oeh on oeh.header_id = tbl0.header_id 
    join APPS.oe_order_lines_all oel on oeh.org_id = oel.org_id and  oeh.header_id = oel.header_id 
    join APPS.xx_assemblies asm on oel.line_id = asm.line_id 
    join APPS.wip_discrete_jobs disc on disc.primary_item_id =  asm.inventory_item_id 
    join (select wdj2.source_line_id, wdj2.attribute9 child_wip, wdj2.wip_entity_id, wdj2.status_type status_type 
        from APPS.wip_discrete_jobs wdj2 
        where attribute9 IS NOT NULL) child_jobs on  child_jobs.child_wip = to_char(disc.wip_entity_id) 
    where oel.link_to_line_id is null 
    
        union 
        -- Orders with star (*) items need to pick profile and customer  length etc from ego_configured_pr_agv view 
        select 
    -- Sales Order  
         oeh.order_number as order_number 
         ,oel.line_number 
         ,oel.pricing_quantity_uom as UOM 
         ,to_char(agv.gx_cp_length) as customer_length 
         ,to_char(agv.gx_cp_th_weight) as theoretical_weight 
         ,agv.gx_cp_surfacetreatment as finish 
         ,oel.attribute18 as order_qty_pcs 
         , to_char(agv.gx_cp_th_weight * agv.gx_cp_length *   oel.ordered_quantity) as order_qty_kgs 
         ,XX.xx_om.GetLineUnitSellingPrice(oel.line_id) sales_value 
         ,XX.xx_om.GetHeaderUnitSellingPrice(oeh.header_id)  total_value 
         ,oel.ordered_quantity ordered_quantity 
    -- Production     
         , tbl0.qty_completed as qty_completed 
         ,disc.wip_entity_id as wip_entity_id 
         ,(select wip_entity_name from APPS.wip_entities ent 
          where ent.wip_entity_id = disc.wip_entity_id) job_name 
         ,disc.status_type 
         ,disc.date_released as job_released_date 
         , DECODE (disc.date_completed, NULL, disc.date_completed, 
         to_date(to_char(to_date(TO_CHAR(disc.date_completed-interval  '7' hour,'DD-MON-YYYY')||'00:00:00','DD-MON-YYYY HH24:MI:SS'),  'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS')) as  date_completed 
         , DECODE (disc.date_closed, NULL, disc.date_closed, 
         to_date(to_char(to_date(TO_CHAR(disc.date_closed-interval  '7' hour,'DD-MON-YYYY')||'00:00:00','DD-MON-YYYY HH24:MI:SS'),  'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS')) as  date_closed 
         , disc.net_quantity 
        , (select opr2.quantity_completed 
        from APPS.wip_operations opr2 
        where opr2.wip_entity_id = disc.wip_entity_id 
        and opr2.operation_seq_num =  (select  max(opr.operation_seq_num) 
                 from APPS.wip_operations opr,  APPS.wip_discrete_jobs disc2 
                 where opr.wip_entity_id =  disc2.wip_entity_id 
                 and disc2.wip_entity_id =  disc.wip_entity_id))* agv.gx_cp_length * agv.gx_cp_th_weight as  prod_qty_kgs 
         ,gx_cp_alloy as alloy 
         ,gx_cp_profile_id as profile 
    -- Theoretical Order cost 
          ,tbl0.TOT_THEORY_COST_RELIEVED 
    -- Actual Order cost 
          ,tbl0.TOT_ACTUAL_COST_INCURRED 
    
    from XX.XXREPORT_Lzero_TBL tbl0 
    join APPS.oe_order_headers_all oeh on oeh.header_id = tbl0.header_id 
    join APPS.oe_order_lines_all oel on oeh.org_id = oel.org_id and   oeh.header_id = oel.header_id 
    join APPS.wip_discrete_jobs disc on oel.line_id =  disc.source_line_id 
    join APPS.ego_gx_configured_pr_agv agv on agv.inventory_item_id=  oel.inventory_item_id 
        where oel.link_to_line_id is null 
         )a 
         ) xx; 
    
+1

テーブル構造はありません。インデックス情報はありません。データサイズに関する情報はありません。実行計画はありません。少なくともいくつかの情報を提供する必要があります。クエリーを自動的に調整するために押すことができる魔法のボタンはありません。 – ruudvan

+1

[ここ](http://stackoverflow.com/questions/34975406/how-to-describe-performance-issue-in-relational-database)あなたは、事前の問題の場合に備えなければならないものを最低限必要とするかもしれません。 –

+1

あなたはLeccotech db Expertでクエリ(とdb接続など)を投げることができ、より速く実行される同等のクエリが表示されます。 – CooncilWorker

答えて

1

このクエリをチューニングするために何も短く、簡単な解決策は、ほぼ確実にありません。ここの問題はサイズと複雑さです。パフォーマンスの欠如は単に結果に過ぎません。

最初の手順として、キーボードを休憩することを検討します。ペンと紙をひっくり返して、簡単な英語(あるいはあなたが好むいずれかの "人間"の言葉)で、あなたのデータベースからこの質問を通して答えたい質問を書いてください。次に、あなた自身に質問してください。これらの質問に絶対に必要な列/変数/属性はありますか?も書き留めてください。

これらの変数を生成するために、これらの列、ネストされた結合、選択などがすべて実際に必要ですか。おそらく、おそらくそうではありません。要点は、必要なデータ/情報(YAGNI)のみに焦点を当て、そこからあなたの質問に答える情報を生み出すために必要な裸の関係を描くことです。言い換えれば、外からではなく、他の方法で作業します。

これはおそらく少し抽象的で曖昧に聞こえることがわかりましたが、全体的なポイントは、明確かつ単純なコードを維持することは常に進行中の闘争であるということです。目的を目の当たりにしておくことは、雑草の頭を守るのに役立ちます。最後に

、一目でいくつかのより具体的な思考:

  • あなたが本当に組合ことは必要ですか?できるならそれなしでやりなさい。
  • ネスティングは吸う。ネストされたネスティングは特に嫌です。可能な限り実用的なものにしてください。
  • これを独立した小さなクエリに分割することは可能でしょうか実際的ですか?
  • 変数にわかりやすい名前を使用し、慎重にコメントを追加します。
  • SQL EXPLAINコマンドを学び、習得してください。
+0

私はいくつかの部分でクエリを分割しようとしましょう。 –