程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 大致分析Oracle SQL語句

大致分析Oracle SQL語句

編輯:Oracle數據庫基礎

本人很喜歡Oracle,在工作中也很喜歡總結關於Oracle SQL語句的經驗教訓,下面就這個問題來詳細說說吧。數據庫管理員還可以通過下述語句查看低效率的Oracle SQL語句,優化這些語句也有助於提高CPU的利用率。

  1. 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

  1. SELECT dname, deptno FROM dept WHERE deptno NOT IN  
  2. (SELECT deptno FROM emp); 

◆ Oracle SQL語句B

  1. SELECT dname, deptno FROM dept WHERE NOT EXISTS  
  2. (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數據庫高效地運行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved