大致分析Oracle SQL語(yǔ)句
本人很喜歡Oracle,在工作中也很喜歡總結(jié)關(guān)于Oracle SQL語(yǔ)句的經(jīng)驗(yàn)教訓(xùn),下面就這個(gè)問(wèn)題來(lái)詳細(xì)說(shuō)說(shuō)吧。數(shù)據(jù)庫(kù)管理員還可以通過(guò)下述語(yǔ)句查看低效率的Oracle SQL語(yǔ)句,優(yōu)化這些語(yǔ)句也有助于提高CPU的利用率。
- SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA;
查看數(shù)據(jù)庫(kù)的沖突情況
數(shù)據(jù)庫(kù)管理員可以通過(guò)V$SYSTEM_EVENT數(shù)據(jù)字典中的“l(fā)atch free”統(tǒng)計(jì)項(xiàng)查看Oracle數(shù)據(jù)庫(kù)的沖突情況,如果沒(méi)有沖突的話,latch free查詢出來(lái)沒(méi)有結(jié)果。如果沖突太大的話,數(shù)據(jù)庫(kù)管理員可以降低spin_count參數(shù)值,來(lái)消除高的CPU使用率。
Oracle SQL語(yǔ)句的調(diào)整原則
SQL語(yǔ)言是一種靈活的語(yǔ)言,相同的功能可以使用不同的語(yǔ)句來(lái)實(shí)現(xiàn)。但是語(yǔ)句的執(zhí)行效率是很不相同的,程序員可以使用EXPLAIN PLAN語(yǔ)句來(lái)比較各種實(shí)現(xiàn)方案,并選出最優(yōu)的實(shí)現(xiàn)方案??偟脕?lái)講,程序員寫(xiě)Oracle SQL語(yǔ)句需要滿足考慮如下規(guī)則:
(1)盡量使用索引。試比較下面兩條Oracle SQL語(yǔ)句:
◆ Oracle SQL語(yǔ)句A
- SELECT dname, deptno FROM dept WHERE deptno NOT IN
- (SELECT deptno FROM emp);
◆ Oracle SQL語(yǔ)句B
- SELECT dname, deptno FROM dept WHERE NOT EXISTS
- (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
這兩條查詢語(yǔ)句實(shí)現(xiàn)的結(jié)果是相同的,但是執(zhí)行語(yǔ)句A的時(shí)候,Oracle會(huì)對(duì)整個(gè)emp表進(jìn)行掃描,沒(méi)有使用建立在emp表上的deptno索引;執(zhí)行語(yǔ)句 B的時(shí)候,由于在子查詢中使用了聯(lián)合查詢,Oracle只是對(duì)emp表進(jìn)行的部分?jǐn)?shù)據(jù)掃描,并利用了deptno列的索引。所以,語(yǔ)句B的效率要比語(yǔ)句A 的效率高一些。
(2)選擇聯(lián)合查詢的聯(lián)合次序。
(3)在子查詢中慎重使用IN或者NOT IN語(yǔ)句,使用where (NOT) exists的效果要好的多。
(4)慎重使用視圖的聯(lián)合查詢,尤其是比較復(fù)雜的視圖之間的聯(lián)合查詢。一般對(duì)視圖的查詢最好都分解為對(duì)數(shù)據(jù)表的直接查詢效果要好一些。
(5)可以在參數(shù)文件中設(shè)置SHARED_POOL_RESERVED_SIZE參數(shù),這個(gè)參數(shù)在SGA共享池中保留一個(gè)連續(xù)的內(nèi)存空間,連續(xù)的內(nèi)存空間有益于存放大的SQL程序包。
(6)Oracle公司提供的DBMS_SHARED_POOL程序可以幫助程序員將某些經(jīng)常使用的存儲(chǔ)過(guò)程“釘”在SQL區(qū)中而不被換出內(nèi)存,程序員對(duì)于經(jīng)常使用并且占用內(nèi)存很多的存儲(chǔ)過(guò)程“釘”到內(nèi)存中有利于提高最終用戶的響應(yīng)時(shí)間。
至此,我們完成了對(duì)Oracle數(shù)據(jù)庫(kù)的優(yōu)化。Oracle數(shù)據(jù)庫(kù)的性能優(yōu)化調(diào)整是一個(gè)系統(tǒng)工程,涉及的方面很多。數(shù)據(jù)庫(kù)管理員需要綜合運(yùn)用上面介紹的優(yōu)化方法和規(guī)律,認(rèn)真分析Oracle運(yùn)行過(guò)程當(dāng)中出現(xiàn)的各種問(wèn)題,合理優(yōu)化,才能保證Oracle數(shù)據(jù)庫(kù)高效地運(yùn)行。
【編輯推薦】