Oracle SQL程式優化案例一

2022-03-09 15:14:44 字數 2789 閱讀 1495

下面是儲存過程的一部分程式:  

procedure sap_man_routing_so (citem_id    varchar2,

csite_id    varchar2,

ctype       varchar2)

isv_routing   varchar2 (40);

begin                                 

if (citem_id not like '%c%')

then

select nvl (trim (rr.routing_id), '')

into v_routing

from (select mapl.plnnr || '_' || mapl.werks routing_id

from sap_mapl_qmcustomer mapl

where     mapl.matnr = citem_id

and mapl.werks = csite_id

and exists

(select null

from sap_mapl_qmcustomer

where     sap_mapl_qmcustomer.matnr =

citem_id

and sap_mapl_qmcustomer.werks =

csite_id)) rr;

elsif (citem_id like '%c%')

then

select nvl (trim (rr.routing_id), '')

into v_routing

from (select max (mapl.plnnr) routing_id

from sap_mapl_qmcustomer mapl

where mapl.matnr = citem_id and mapl.werks = csite_id) rr;

end if;

從**上來看,改程式似乎沒有什麼缺陷,執行也相當順暢,但有一天突然一直報

ora-01403: 未找到任何資料ora-06512: 在 "stg.sap_so_bom_proc", line 428

ora-06512: 在 "stg.sap_so_bom_proc", line 1097

通過分析發現缺少對結果集行數做乙個判斷,如果返回的是0行資料,那就是沒有值,沒有值就會報錯,

所以以下是對該程式進行判斷:

procedure sap_man_routing_so (citem_id    varchar2,

csite_id    varchar2,

ctype       varchar2)

isv_routing   varchar2 (40);

qty         number;

begin

select count(*) into qty          

from (select mapl.plnnr || '_' || mapl.werks routing_id

from sap_mapl_qmcustomer mapl

where     mapl.matnr = citem_id

and mapl.werks = csite_id

and exists

(select null

from sap_mapl_qmcustomer

where     sap_mapl_qmcustomer.matnr =

citem_id

and sap_mapl_qmcustomer.werks =

csite_id)) rr;

if qty>0  then                                       

if (citem_id not like '%c%')

then

select nvl (trim (rr.routing_id), '')

into v_routing

from (select mapl.plnnr || '_' || mapl.werks routing_id

from sap_mapl_qmcustomer mapl

where     mapl.matnr = citem_id

and mapl.werks = csite_id

and exists

(select null

from sap_mapl_qmcustomer

where     sap_mapl_qmcustomer.matnr =

citem_id

and sap_mapl_qmcustomer.werks =

csite_id)) rr;

elsif (citem_id like '%c%')

then

select nvl (trim (rr.routing_id), '')

into v_routing

from (select max (mapl.plnnr) routing_id

from sap_mapl_qmcustomer mapl

where mapl.matnr = citem_id and mapl.werks = csite_id) rr;

end if;

else

--程式漏洞,沒有考慮返回值為0行的結果,現加判斷引數qty作為返回行數的總數,大於1將執行原先的程式,否則直接賦空值 add by zhangguipeng20170216

v_routing:='';

end if;

Oracle SQL程式優化案例二

有時候寫得不規範的sql語句真的是占用很多時間 以下是我在工作中發現的規律,如果欄位過多的使用函式,盡量不要將這些字段串聯在一起做匹配或查詢條件,比如紅色注釋部分,在執行紅色部分的時候 這個sql程式是執行了7分多鐘,但是將函式分開做匹配的戶查詢時間不用1秒 select ebeln ltrim s...

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...

Oracle Sql優化筆記

基本的sql 編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自 動對sql語句 進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用 cbo cost based optimization 基於代價的 優化方式 時。我們可以 總結一下可能引起全表 掃瞄的操作 or...