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

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

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

時(shí)間:2015-06-28 00:00:00 來(lái)源: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種方法沒有試過(guò)。

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

??? 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ì)語(yǔ)言的break語(yǔ)句類似。在嵌套的循環(huán)中,如果要直接從內(nèi)層循環(huán)跳出外面多層的循環(huán),可使用'EXIT 標(biāo)簽 When'形式的語(yǔ)句,舉例如下:

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)。

<button id="nwhef"></button>
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來(lái)增加,刪除,修改列的語(yǔ)法 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法