2017-05-10 13 views
0

以下のSQLクエリは実行に時間がかかりすぎています。 from節で同じテーブルを繰り返し使用している可能性があります。パフォーマンスが向上するようにこのクエリを修正する方法を見つけることができません。 誰もがこれで私を助けることができますか?Oracleのクエリパフォーマンスを向上させる方法

ありがとうございます!

select -- 
    from t_carrier_location act_end, 
     t_location   end_loc, 
     t_carrier_location act_start, 
     t_location   start_loc, 
     t_vm_voyage_activity va, 
     t_vm_voyage   v, 
     t_location_position lp_start, 
     t_location_position lp_end 
where act_start.carrier_location_id = va.carrier_location_id 
    and act_start.carrier_id = v.carrier_id 
    and act_end.carrier_location_id = 
     decode((select cl.carrier_location_id 
       from t_carrier_location cl 
       where cl.carrier_id = act_start.carrier_id 
       and cl.carrier_location_no = 
        act_start.carrier_location_no + 1), 
       null, 
       (select cl2.carrier_location_id 
       from t_carrier_location cl2, t_vm_voyage v2 
       where v2.hire_period_id = v.hire_period_id 
        and v2.voyage_id = 
         (select min(v3.voyage_id) 
         from t_vm_voyage v3 
         where v3.voyage_id > v.voyage_id 
          and v3.hire_period_id = v.hire_period_id) 
        and v2.carrier_id = cl2.carrier_id 
        and cl2.carrier_location_no = 1), 
       (select cl.carrier_location_id 
       from t_carrier_location cl 
       where cl.carrier_id = act_start.carrier_id 
        and cl.carrier_location_no = 
         act_start.carrier_location_no + 1)) 
    and lp_start.location_id = act_start.location_id 
    and lp_start.from_date <= 
     nvl(act_start.actual_dep_time, act_start.actual_arr_time) 
    and (lp_start.to_date is null or 
     lp_start.to_date > 
     nvl(act_start.actual_dep_time, act_start.actual_arr_time)) 
    and lp_end.location_position_id = act_end.location_id 
    and lp_end.from_date <= 
     nvl(act_end.actual_dep_time, act_end.actual_arr_time) 
    and (lp_end.to_date is null or 
     lp_end.to_date > 
     nvl(act_end.actual_dep_time, act_end.actual_arr_time)) 
    and act_end.location_id = end_loc.location_id 
    and act_start.location_id = start_loc.location_id; 
+0

を参照してチューニングするにはERモデルといくつかのサンプルデータを与えてください。 –

+0

相関サブクエリをJOINs – GurV

+0

に変更しました。データと要件に基づいてテーブルのインデックスを作成しましたか。それは適切に決定されなければならない。 – Raghvendra

答えて

1

あなたの質問とあなたが言及した質問に対して、先向きの回答はありません。 クエリの応答時間を短縮するには、クエリを書く際に留意すべき点がほとんどありません。ここであなたのクエリにとって重要と思われるものはほとんどありません。

  1. サブクエリーの代わりにジョインを使用してください。
  2. EXPLAINを使用すると、クエリが適切に機能していると判断できます。
  3. where句でインデックスを持つカラムを使用します。それ以外の場合は、それらのカラムにインデックスを作成します。たとえば、外部キー列、deleted、orderCreatedAt、startDateなどの索引を付ける列である常識を使用します。
  4. 列を任意に選択するのではなく、表に表示されるように選択列の順序を保ちます。

上記の4つの点は、入力したクエリで十分です。

SQLの最適化について深く掘ると、このhttps://docs.oracle.com/database/121/TGSQL/tgsql_intro.htm#TGSQL130

+0

貴重なご回答ありがとうございます! – Sach

関連する問題