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