Oracle數據庫一些不常見但很重要的使用技巧總結篇
Oracle數據庫使用過程中,有一些技巧是使用過程中需要去了解和掌握的,掌握這些技巧我們在以后使用數據庫的過程中就可以避免走很多彎路,提高查詢效率。本文主要介紹一下七點技巧,希望能對各位有所幫助,接下來我們就一一介紹。
使用技巧:
1. procedure和function中的select后面不要跟變量,否則會極大的波及SQL效率。
2. TRUNCATE 在procedure中無法利用,可寫成:
- EXECUTE IMMEDIATE 'truncate table smic_rtd_bullet_lot_tmp';
3. 當運行DML(數據壟斷語言,增刪改查)語句時,PL/SQL敞開一個內建游標并處理收獲,游標是維護查詢收獲的內存中的一個區域,游標在運行DML語句時敞開,告終后關閉。隱式游標只利用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個屬性。SQL%FOUND, SQL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數值。告終循環時能夠此作為退出循環的推斷規范。
4. 為了不重復解析雷同的SQL語句,在第順次解析爾后,ORACLE將SQL語句儲藏在內存中。這塊位于系統大局區域SGA(system global area)的分享池(shared buffer pool)中的內存能夠被所有的數據庫用戶分享。因而,當你厲行一個SQL語句(有時被稱為一個游標)時,萬一它和之前的厲行過的語句全面雷同,ORACLE就能很快獲得曾經被解析的語句以及良好的厲行路徑。分享的語句定然中意三個條件:
a. 字符級的比擬:目前被厲行的語句和分享池中的語句定然全面雷同。包括所有的空格和字母大小寫。
b. 兩個語句所指的對象定然全面雷同。例如兩個用戶對于統一個表,一個是table owner,一個是引用同義詞,那么是無法SQL分享的。
c. 兩個SQL語句中定然利用雷同的名字的綁定變量。凡是變量名字雷同,即便在運行時,賦于不同的綁定變量雷同的值也是能夠的。
統一SQL在一個session多處利用,萬一多次改變,經常因為空格和字母大小寫不統一導致SQL未曾分享。利用 WITH a AS (SELECT * FROM ……) 將查詢命名為a,爾后能夠將a當做SQL利用,能夠確保順次解析多次利用,能夠長進效率。
5. 凡是有可能,在過程中盡量多利用COMMIT,這么過程的功能獲得長進,需求也會因為COMMIT所釋放的資源而收縮:
COMMIT所釋放的資源:
a. 回滾段上用于復如數據的消息。
b. 被過程語句獲得的鎖。
c. redo log buffer 中的空間。
d. ORACLE為管教上述3種資源中的內部花費。
在利用COMMIT時定然要當心到事務的全面性,切實中效率和事務全面性經常是魚和熊掌不可得兼。
6. 穿越內部函數長進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;
穿越調用下面的函數能夠長進效率。
- 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;
許多人適應性想用一個SQL寫出必需的數據,殊不知混雜的SQL經常獻身了厲行效率。 能夠掌握上面的利用函數處理問題的措施在切實工作中是極其故含義的。
7. 通常情形下,用UNION輪換WHERE子句中的OR將會起到較好的收獲。對索引列利用OR將造成全表掃描。當心,以上法定只針對多個索引列管用。萬一有column未曾被索引,查詢效率可能會因為你未曾抉擇OR而減退。
關于Oracle數據庫的使用技巧就介紹到這里,如果您想了解更多關于Oracle數據庫的知識,不妨看一下這里的文章:http://database.51cto.com/oracle/,相信會給各位帶來收獲的!
【編輯推薦】