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