[英]How to increase performance in sql query?
我正在使用oracle sql。 我有一個查詢:
查詢1
select t1.object_id object1, t2.object_id ... --etc--
from objects t1, objects t2, object_types t3 ... --etc--
where ... --many conditions--
它確實有效。 現在,我必須選擇t1.object1的n級父級。
它是我對此的查詢:
查詢2:
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
其bulk collect
到某個變量中,但是我想使用盡可能多的pl / sql。 所以我考慮with-作為語法。
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。 我該如何無例外且盡快地做到這一點?
以及如何在query1中選擇父類型? 我必須在where子句中編寫分層查詢嗎?
如果您正在尋找速度,則不想執行嵌套查詢。 嘗試將嵌套查詢中存在的每個數據集放入臨時表中,然后將它們聯接。 然后,僅拉出所需的列和較小的數據集,然后運行一次。 沒錯,嵌套查詢將一遍又一遍地運行,因此,如果您有大量數據,則效率低下。
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 --;
我決定在函數中進行2個查詢。 首先是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;
我認為我的查詢3出現了問題。 我寫了新查詢,效果很好。 現在我的表現不錯。 謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.