Oracle數(shù)據(jù)庫(kù)一些不常見但很重要的使用技巧總結(jié)篇
Oracle數(shù)據(jù)庫(kù)使用過(guò)程中,有一些技巧是使用過(guò)程中需要去了解和掌握的,掌握這些技巧我們?cè)谝院笫褂脭?shù)據(jù)庫(kù)的過(guò)程中就可以避免走很多彎路,提高查詢效率。本文主要介紹一下七點(diǎn)技巧,希望能對(duì)各位有所幫助,接下來(lái)我們就一一介紹。
使用技巧:
1. procedure和function中的select后面不要跟變量,否則會(huì)極大的波及SQL效率。
2. TRUNCATE 在procedure中無(wú)法利用,可寫成:
- EXECUTE IMMEDIATE 'truncate table smic_rtd_bullet_lot_tmp';
3. 當(dāng)運(yùn)行DML(數(shù)據(jù)壟斷語(yǔ)言,增刪改查)語(yǔ)句時(shí),PL/SQL敞開一個(gè)內(nèi)建游標(biāo)并處理收獲,游標(biāo)是維護(hù)查詢收獲的內(nèi)存中的一個(gè)區(qū)域,游標(biāo)在運(yùn)行DML語(yǔ)句時(shí)敞開,告終后關(guān)閉。隱式游標(biāo)只利用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個(gè)屬性。SQL%FOUND, SQL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數(shù)值。告終循環(huán)時(shí)能夠此作為退出循環(huán)的推斷規(guī)范。
4. 為了不重復(fù)解析雷同的SQL語(yǔ)句,在第順次解析爾后,ORACLE將SQL語(yǔ)句儲(chǔ)藏在內(nèi)存中。這塊位于系統(tǒng)大局區(qū)域SGA(system global area)的分享池(shared buffer pool)中的內(nèi)存能夠被所有的數(shù)據(jù)庫(kù)用戶分享。因而,當(dāng)你厲行一個(gè)SQL語(yǔ)句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),萬(wàn)一它和之前的厲行過(guò)的語(yǔ)句全面雷同,ORACLE就能很快獲得曾經(jīng)被解析的語(yǔ)句以及良好的厲行路徑。分享的語(yǔ)句定然中意三個(gè)條件:
a. 字符級(jí)的比擬:目前被厲行的語(yǔ)句和分享池中的語(yǔ)句定然全面雷同。包括所有的空格和字母大小寫。
b. 兩個(gè)語(yǔ)句所指的對(duì)象定然全面雷同。例如兩個(gè)用戶對(duì)于統(tǒng)一個(gè)表,一個(gè)是table owner,一個(gè)是引用同義詞,那么是無(wú)法SQL分享的。
c. 兩個(gè)SQL語(yǔ)句中定然利用雷同的名字的綁定變量。凡是變量名字雷同,即便在運(yùn)行時(shí),賦于不同的綁定變量雷同的值也是能夠的。
統(tǒng)一SQL在一個(gè)session多處利用,萬(wàn)一多次改變,經(jīng)常因?yàn)榭崭窈妥帜复笮懖唤y(tǒng)一導(dǎo)致SQL未曾分享。利用 WITH a AS (SELECT * FROM ……) 將查詢命名為a,爾后能夠?qū)當(dāng)做SQL利用,能夠確保順次解析多次利用,能夠長(zhǎng)進(jìn)效率。
5. 凡是有可能,在過(guò)程中盡量多利用COMMIT,這么過(guò)程的功能獲得長(zhǎng)進(jìn),需求也會(huì)因?yàn)镃OMMIT所釋放的資源而收縮:
COMMIT所釋放的資源:
a. 回滾段上用于復(fù)如數(shù)據(jù)的消息。
b. 被過(guò)程語(yǔ)句獲得的鎖。
c. redo log buffer 中的空間。
d. ORACLE為管教上述3種資源中的內(nèi)部花費(fèi)。
在利用COMMIT時(shí)定然要當(dāng)心到事務(wù)的全面性,切實(shí)中效率和事務(wù)全面性經(jīng)常是魚和熊掌不可得兼。
6. 穿越內(nèi)部函數(shù)長(zhǎng)進(jìn)SQL效率。
- SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)
- FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H
- WHERE H.EMPNO = E.EMPNO
- AND H.HIST_TYPE = T.HIST_TYPE
- GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;
穿越調(diào)用下面的函數(shù)能夠長(zhǎng)進(jìn)效率。
- FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2
- AS
- TDESC VARCHAR2(30);
- CURSOR C1 IS
- SELECT TYPE_DESC
- FROM HISTORY_TYPE
- WHERE HIST_TYPE = TYP;
- BEGIN
- OPEN C1;
- FETCH C1 INTO TDESC;
- CLOSE C1;
- RETURN (NVL(TDESC,尼康鏡頭’?’));
- END;
- FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2
- AS
- ENAME VARCHAR2(30);
- CURSOR C1 IS
- SELECT ENAME
- FROM EMP
- WHERE EMPEMPNO=EMP;
- BEGIN
- OPEN C1;
- FETCH C1 INTO ENAME;
- CLOSE C1;
- RETURN (NVL(ENAME,’?’));
- END;
- SELECT H.EMPNO,嬰兒奶粉排行榜LOOKUP_EMP(H.EMPNO),
- H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)
- FROM EMP_HISTORY H
- GROUP BY H.EMPNO , H.HIST_TYPE;
許多人適應(yīng)性想用一個(gè)SQL寫出必需的數(shù)據(jù),殊不知混雜的SQL經(jīng)常獻(xiàn)身了厲行效率。 能夠掌握上面的利用函數(shù)處理問(wèn)題的措施在切實(shí)工作中是極其故含義的。
7. 通常情形下,用UNION輪換WHERE子句中的OR將會(huì)起到較好的收獲。對(duì)索引列利用OR將造成全表掃描。當(dāng)心,以上法定只針對(duì)多個(gè)索引列管用。萬(wàn)一有column未曾被索引,查詢效率可能會(huì)因?yàn)槟阄丛駬馩R而減退。
關(guān)于Oracle數(shù)據(jù)庫(kù)的使用技巧就介紹到這里,如果您想了解更多關(guān)于Oracle數(shù)據(jù)庫(kù)的知識(shí),不妨看一下這里的文章:http://database.51cto.com/oracle/,相信會(huì)給各位帶來(lái)收獲的!
【編輯推薦】