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