IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁數(shù)據(jù)庫Oracle → 淺談Oracle性能優(yōu)化可能出現(xiàn)的問題

淺談Oracle性能優(yōu)化可能出現(xiàn)的問題

時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

   筆者在看oracle性能優(yōu)化一書時(shí),講到用exists替代in,用表鏈接替代exists,關(guān)于前者,一般效果比較明顯,exists效率明顯比in高,但是如果要想表連接的效率比exists高,必須在from子句中,將記錄多的表放在前面,記錄少的表放后面。

   關(guān)于select... bulk collect into ... limit ...或fetch... bulk collect into ... limit ...句型:

   在使用如上句型時(shí),通常我們都會(huì)用for或forall循環(huán)進(jìn)行insert/update/delete操作。

   for/forall循環(huán)方法有好幾種,如  

   第1種:

for tp in tmp.FIRST.. tmp.LAST loop   
....  
end loop;

   第2種:

for tp in 1 .. tmp.COUNT loop   
....  
end loop; 

   第3種:

for tp in indecs of tmp loop   
....  
end loop;

   上面的第1種方法有一個(gè)致使的弱點(diǎn),就是在select... bulk collect into ... limit ...或fetch... bulk collect into ... limit ...沒有取到數(shù)據(jù)時(shí),如果沒有exit,則第一種方法會(huì)報(bào)錯(cuò):ORA-06502: PL/SQL: numeric or value error。因?yàn)閠mp.FIRST訪問不存在,為空值。必須對(duì)錯(cuò)誤進(jìn)行錯(cuò)誤處理。而在嵌套的循環(huán)中,內(nèi)層的循環(huán)是不能用exit的,所有必然遇到這種錯(cuò)誤。

   第2種方法不會(huì)出現(xiàn)這種問題,第3種方法沒有試過。

   借鑒網(wǎng)上的做法,給出一種使用綁定變量的批量刪除數(shù)據(jù)的存儲(chǔ)過程:

    PROCEDURE RemoveBat2DjaRecords(參數(shù))    
AS  
type RowIdArray is table of rowid index by binary_integer;   
rowIds RowIdArray;  
BEGIN  
loop  
select rowid BULK COLLECT into rowIds from 表名  
where 查詢條件 and rownum <= 1000;     
exit when SQL%NOTFOUND;  
forall k in 1 .. rowIds.COUNT  
delete from 表名 where rowid = rowIds(k);   
commit;  
end loop;   
EXCEPTION  
when OTHERS then
rollback;  
END RemoveBat2DjaRecords; 

   上面的1000條是一個(gè)可以設(shè)定的數(shù),根據(jù)你的服務(wù)器性能可以擴(kuò)大或縮小。

   用exit跳出循環(huán),通常情況下,exit只跳出當(dāng)前層的循環(huán),與其它程序設(shè)計(jì)語言的break語句類似。在嵌套的循環(huán)中,如果要直接從內(nèi)層循環(huán)跳出外面多層的循環(huán),可使用'EXIT 標(biāo)簽 When'形式的語句,舉例如下:

SQL>   BEGIN   
2    <>  
3    FOR v_outerloopcounter IN 1..2 LOOP  
4   <>  
5   FOR v_innerloopcounter IN 1..4 LOOP  
6  DBMS_OUTPUT.PUT_LINE('Outer Loop counter is ' 
7 || v_outerloopcounter ||  
8 ' Inner Loop counter is ' || v_innerloopcounter);  
9 EXIT WHEN v_innerloopcounter = 3;  
10  END LOOP innerloop;  
11   END LOOP outerloop;  
12    END;  
13    /  
Outer Loop counter is 1 Inner Loop counter is 1  
Outer Loop counter is 1 Inner Loop counter is 2  
Outer Loop counter is 1 Inner Loop counter is 3  
Outer Loop counter is 2 Inner Loop counter is 1  
Outer Loop counter is 2 Inner Loop counter is 2  
Outer Loop counter is 2 Inner Loop counter is 3  

PL/SQL procedure successfully completed.  

   從上面可以看出,普通情況下,exit只跳出當(dāng)前層的循環(huán)。

    SQL>   BEGIN   
    2    <>  
    3    FOR v_outerloopcounter IN 1..2 LOOP  
    4   <>  
    5   FOR v_innerloopcounter IN 1..4 LOOP  
    6  DBMS_OUTPUT.PUT_LINE('Outer Loop counter is ' 
    7 || v_outerloopcounter ||  
    8 ' Inner Loop counter is ' || v_innerloopcounter);  
    9 EXIT outerloop WHEN v_innerloopcounter = 3;  
    10  END LOOP innerloop;  
    11   END LOOP outerloop;  
    12    END;  
    13  &

    關(guān)鍵詞標(biāo)簽:Oracle

    相關(guān)閱讀

    文章評(píng)論
    發(fā)表評(píng)論

    熱門文章 Oracle中使用alter table來增加,刪除,修改列Oracle中使用alter table來增加,刪除,修改列oracle中使用SQL語句修改字段類型-oracle修oracle中使用SQL語句修改字段類型-oracle修使用低權(quán)限Oracle數(shù)據(jù)庫賬戶得到管理員權(quán)限使用低權(quán)限Oracle數(shù)據(jù)庫賬戶得到管理員權(quán)限Oracle對(duì)user的訪問控制Oracle對(duì)user的訪問控制

    相關(guān)下載

    人氣排行 ORACLE SQL 判斷字符串是否為數(shù)字的語句Oracle中使用alter table來增加,刪除,修改列的語法ORACLE和SQL語法區(qū)別歸納(1)oracle grant 授權(quán)語句如何加速Oracle大批量數(shù)據(jù)處理Oracle刪除表的幾種方法ORACLE修改IP地址后如何能夠使用Oracle 10g創(chuàng)建表空間和用戶并指定權(quán)限

          <ul id="uogig"></ul>