1

我想從表中讀取所有產品代碼(mal_no列)和數量數據(adet列)(這是「hso」表和mal_no索引,下表中的所有表具有mal_no的索引),但即使它只有一行數據,它仍然運行並永不結束。加入到1行表需要太多時間

沒有此連接的查詢(通過僅添加註釋掉的部分)即時。

你有什麼建議嗎?

感謝,

select mt.mal_no,hso.adet siparis, 
    mot.birim_no,round((mbs.eldeki_stok_miktar*0.8),0) duzelts, 
    mot.oncelik, 
    SUM(round((mbs.eldeki_stok_miktar*0.8),0)) OVER(ORDER BY 
    mot.oncelik desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) kumule_stok 
from [email protected] mbs 
    ,[email protected] mt 
    ,[email protected] mot 
    ,web_hso hso 
where 1=1 
and hso.mal_no=mbs.mal_no 
and mbs.mal_no=mt.mal_no 
and mbs.birim_no=mot.birim_no 
and mt.mal_grup_no=mot.mal_grup_no 
and mt.mal_altgrup_no=mot.mal_altgrup_no 
--and mt.mal_no in ('1035541001') 
and mbs.eldeki_stok_miktar>0 
and mot.oncelik>0 
and mbs.ambar_no='01' 
order by mot.oncelik desc 
+0

連接似乎okkay,你可以或許提供給我們這些表的DDL /結構。 –

回答

0

這是很難從這麼多的信息告訴。

但我建議你遵循這個步驟:

  1. 如果您有任何數據庫管理員或者,如果你有合適的工具,檢查執行計劃。 (例如,TOAD顯示Oracle數據庫的執行計劃。)
  2. 如果在嵌套循環內的執行計劃中看到「全面掃描」,則表示數據庫一遍又一遍地掃描表。 where條件的項目找到它首先降低設定的那些

    1. 其中:

    對於整體的方法,你可以使用這些方法。

  3. (Oracle)使用索引提示和use_nl提示來顯式定義數據庫,它應該如何去表。

最後,對於一個原則,儘量避免大連接。劃分並征服你的數據。嘗試編寫嵌套循環並在檢索數據時儘可能多地使用索引。

2

您正在將三個表從遠程數據庫連接到本地數據庫中的一個表。像這樣的分佈式查詢速度很慢,因爲數據必須通過兩個數據庫之間的網絡發送。

本地數據庫將發送子查詢到遠程數據庫;但加入和過濾發生在本地,所以可能會從遠程數據庫傳輸大量冗餘數據。因此,您需要爲優化器提供足夠的信息,以便可以創建巧妙的子查詢。

例如,在隔離線視圖遠程表:

select rmt.mal_no, 
     hso.adet siparis, 
     rmt.birim_no, 
     rmt.duzelts, 
     rmt.oncelik, 
     rmt.kumule_stok 
from web_hso hso 
    join 
     (select mt.mal_no, 
       mot.birim_no, 
       round((mbs.eldeki_stok_miktar*0.8),0) duzelts, 
       mot.oncelik, 
       SUM(round((mbs.eldeki_stok_miktar*0.8),0)) 
       OVER(ORDER BY mot.oncelik desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) kumule_stok 
from [email protected] mbs 
    join [email protected] mt 
     on mbs.mal_no=mt.mal_no 
    join [email protected] mot 
     on mbs.birim_no=mot.birim_no 
     and mt.mal_grup_no=mot.mal_grup_no 
     and mt.mal_altgrup_no=mot.mal_altgrup_no 
     where mbs.eldeki_stok_miktar>0 
     and mot.oncelik>0 
     and mbs.ambar_no='01') rmt 
    on hso.mal_no=rmt.mal_no 
    order by rmt.oncelik desc 

顯然,這只是一種猜測,因爲我不明白你的數據模型和數據。你需要在這裏應用你的領域知識來製作一個好的查詢。單獨的內聯視圖可能無法提供您所需的全部速度。例如,如果大多數工作涉及到三個遠程表上的連接,並且很可能是這樣,那麼@BriteSponge建議您可能發現使用the driving_site hint可以顯着提高性能。因此,使用上面的內聯視圖,代碼將開始

select /*+DRIVING_SITE(rmt)*/ 
     rmt.mal_no, 
     hso.adet siparis, 
     rmt.birim_no, 
     rmt.duzelts, 
     rmt.oncelik, 
     rmt.kumule_stok 
from web_hso hso 
    join (...) rmt 
    on hso.mal_no=rmt.mal_no 

Oracle文檔有進一步的指導。 Find out more

+0

我不太喜歡提示,但它看起來像使用DRIVING_SITE提示也可能在這裏幫助。 – BriteSponge

+0

@BriteSponge - DRIVING_SITE提示通常被認爲是更安全的提示之一。這是一個很好的建議,我已經將其納入我的答案, – APC