簡體   English   中英

如何在Oracle中提高查詢性能

[英]How to improve query performance in Oracle

下面的sql查詢占用太多時間執行。 這可能是由於from子句中重復使用了相同的表。 我不知道如何解決此查詢,以便提高性能。 誰能幫我這個忙嗎?

提前致謝 !!

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;

對於您的問題和您提到的查詢,沒有史特賴特提供的一個答案。 為了獲得更好的任何查詢響應時間,在編寫查詢時您需要牢記一些事情。 在這里我只會提及對您的查詢很重要的幾個

  1. 使用聯接而不是子查詢。
  2. 使用EXPLAIN確定查詢是否正常運行。
  3. 將帶有索引的列與where子句一起使用,否則在這些列上創建索引。 這是您的常識,即要被索引的列,例如:外鍵列,已刪除,orderCreatedAt,startDate等。
  4. 保持選擇列在表中的顯示順序,而不是任意選擇列。

以上四點足以滿足您提供的查詢要求。

要深入了解SQL優化和調優,請參閱此https://docs.oracle.com/database/121/TGSQL/tgsql_intro.htm#TGSQL130

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM