2015-09-09 162 views
0

我正在使用oracle sql。我有一個查詢:如何提高sql查詢的性能?

QUERY1

select t1.object_id object1, t2.object_id ... --etc-- 
from objects t1, objects t2, object_types t3 ... --etc-- 
where ... --many conditions-- 

它的實際工作。現在我必須選擇t1.object1的n級父項。

它我查詢此:

QUERY2:

select object_id 
      from objects 
       where object_type_id in 
      (--query3--) 
and rownum = 1 
      connect by prior parent_id = object_id 
      start with object_id= -- t1.object_id value --; 

它的工作原理也一樣,如果我手動編寫t1.object_id值。問題是,如果我編寫一些數字而不是query3,它的運行速度將快100倍。 IMO發生,因爲查詢每次執行每個對象。

現在我需要做出一個性能良好的大查詢。我該怎麼做?

首先,我需要提高query2的性能。我希望query3不要執行很多次。我可以將它bulk collect它變成一些變量,但我想盡可能多地使用pl/sql。所以我想用 - 作爲語法。

with types as (--query3--) 
select object_id 
       from objects 
        where object_type_id in 
       (types) 
    and rownum = 1 
       connect by prior parent_id = object_id 
       start with object_id= -- t1.object_id value --; 

此查詢的輸出是exeption。 我該如何儘可能快地做到這一點?

如何選擇查詢1中的父類型?我必須在where子句中編寫分層查詢嗎?

+0

運行查詢時出現異常? –

回答

0

如果您正在尋找速度,您不想執行嵌套查詢。嘗試將存在於嵌套查詢中的每個數據集放入臨時表中並加入它們。然後,您只需拖拉需要的列和較小的數據集,然後運行一次。你是對的,嵌套查詢會反覆運行,所以如果你有很多數據,效率不高。

select col1, col2 into #query3 
from table1 

然後,

select object_id 
      from objects o 
      join #query3 q on o.field=q.field 
       where object_type_id = valuefromquery3 
and rownum = 1 
      connect by prior parent_id = object_id 
      start with object_id= -- t1.object_id value --; 
+0

謝謝。我明天會嘗試。 –

0

我決定做2個查詢我的功能。首先是query1,我沒有改變它。然後我意識到我已經從我的QUERY1輸出數組一個循環,所以我寫了

select object_id bulk collect into some variable 
      from objects 
       where object_type_id in 
      (--new query3--) 
and rownum = 1 
      connect by prior parent_id = object_id 
      start with object_id= variable; 

我想,我在我的QUERY3問題。我寫了新的查詢,它運作良好。現在我有很好的表現。謝謝!