Oracle應用程序效率的提高可以從以下幾個方面著手進行:⑴業(yè)務邏輯功能調(diào)整;⑵優(yōu)化數(shù)據(jù)結(jié)構(gòu)設計;⑶優(yōu)化數(shù)據(jù)處理步驟;
Oracle應用程序效率的提高可以從以下幾個方面著手進行:
⑴業(yè)務邏輯功能調(diào)整;
⑵優(yōu)化數(shù)據(jù)結(jié)構(gòu)設計;
⑶優(yōu)化數(shù)據(jù)處理步驟;
⑷優(yōu)化SQL語句;
⑸物理結(jié)構(gòu)調(diào)整;
⑹內(nèi)存分配優(yōu)化;
⑺I/O調(diào)整;
⑻解決內(nèi)存爭用;
⑼優(yōu)化操作系統(tǒng)。
這里主要就SQL語句的優(yōu)化總結(jié)一些經(jīng)驗以供參考:
1、SQL語句書寫格式,使用共享SQL語句資源
在Oracle Server中,執(zhí)行的SQL語句以游標(cursor)的方式存在于共享SQL區(qū)(sharedSQL aera)中,并按照下圖所示流程處理:
當執(zhí)行一條SQL語句時,Oracle先在共享SQL區(qū)中查找是否有相同的SQL語句存在,如果不存在,Oracle將新建游標,并且對語句進行分析,然后綁定變量并按分析后的執(zhí)行計劃執(zhí)行SQL語句;但如果有相同的SQL語句存在,Oracle可共享使用已有游標,僅需重新綁定變量(或者不需要),即可重復執(zhí)行。因此,使用相同的SQL語句,可以節(jié)省系統(tǒng)內(nèi)存空間,提高代碼運行效率。
Oracle按照以下原則判斷SQL語句是否相同:
⑴字母大小寫相同;
⑵空格數(shù)相同;
⑶注釋相同;
⑷所使用的數(shù)據(jù)庫對象(如:表等)相同;
⑸變量類型相同。
為實現(xiàn)游標共享,可使用存儲過程、觸發(fā)器、程序庫等方式編寫集中的代碼。同時,按照固定的格式書寫SQL語句也將提高游標共享的機率,從而提高代碼效率。下例可作為SQL語句的書寫格式以供參考:
2、使用索引
在對大量數(shù)據(jù)的表進行操作時,使用索引可以提高程序執(zhí)行效率。建立索引時應注意:
⑴ 將經(jīng)常用來查詢的字段放在復合索引的前面;
⑵ 建立全表索引時,將性最強的字段放在最前面;
⑶ 建立主鍵、唯一鍵約束時,系統(tǒng)自動建立索引;
⑷ 建立外鍵約束時,系統(tǒng)不會自動建立索引,此時如果被引用的表經(jīng)常修改,應在外鍵字段上建立索引,以防止鎖表;
例如:pol_info.applicant引用client_info.insno作外鍵,如果pol_info.applicant上無索引,則修改client_info時會鎖pol_info,如果在pol_info.applicant上加索引,即可防止上述鎖出現(xiàn),從而提高程序運行效率。
⑴ 只加必要的索引,否則反而會影響效率;
例如:對存在大量重復值的字段加索引會使程序執(zhí)行效率大幅降低。
⑵ 盡量在where字句中直接使用有索引的字段;
例如:where col1= ‘XXX’及where col1 > v_num均可利用索引,而where col1||‘’= ‘XXX’或where col1-0 > v_num則不可利用索引。
⑶ 可強制SQL語句使用索引;例如:
select /*+index(classes)*/ *
from classes
where type = ‘IDL’
and loc_id between 3003 and 30005;
3、表連接
⑴ 使用非相等連接將降低執(zhí)行效率;
⑵ 多個表連接時,對于在select子句中不出現(xiàn)的表,可用子查詢代替表連接;
⑶ 在from子句中,將小表放在后面,可提高執(zhí)行效率;
⑷ 在where子句中將過濾記錄數(shù)最多的條件放在最后;
⑸ 子查詢數(shù)量較大時,使用表連接代替低效的SQL語句(IN,EXISTS,NOT IN,NOT EXISTS等)。
例如:有表一:createtable tab1(col1 varchar2(20) primary key,col2 number);
和表二:createtable tab2(col1 varchar2(20) primary key,col2 number);
A 現(xiàn)讀取sum(tab1.col2),,且tab1.col1存在于tab2.col1中:
使用IN:select sum(col2) from tab1 wherecol1 in (select col1 fromtab2);
使用EXISTS:selectsum(col2) from tab1 a
where exists ( select * from tab2 wherecol1=a.col1);
使用連接:selectsum(a.col2) from tab1 a,tab2b where a.col1=b.col2;
B 現(xiàn)讀取sum(tab1.col2),且tab1.col1不存在于tab2.col1中:
使用NOT IN:select sum(col2) from tab1 wherecol1 not in (select col1 from tab2);
使用NOTEXISTS:select sum(col2) from tab1 a
where not exists ( select * from tab2 wherecol1=a.col1);
使用外連接:selectsum(a.col2) from tab1 a,tab2b
where a.col1=b.col2(+) and b.col1 is null;
4、嵌套循環(huán)
在PL/SQL過程中,如果有兩個表查詢結(jié)果的嵌套循環(huán),應盡量將小表放在外層循環(huán)中。
5、大表掃描
如果需要對兩張很大的表進行連接掃描,并且其中一表的連接字段為主鍵或唯一鍵,可用過程實現(xiàn)兩表均一次掃描完成。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com