簡體   English   中英

如何提高SQL查詢的性能?

[英]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 collectbulk 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.

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