如何利用oracle第三方工具作數據庫的性能優化

常常看到不少人費好大力氣寫好了SQL,可是執行效率很慢。一提到性能優化就撓頭,四處尋求幫助。 sql

其實若是瞭解哪些方面會影響oracle性能的話,這並非一件難事。若是可以藉助到第三方工具的幫助,那麼性能優化簡直就是傻瓜式的。 數據庫

今天就誓將教會你如何利用object browser的功能來優化數據庫性能。 緩存



  • 1、Oracle統計信息的調整

一個運行良好的數據庫,經常面臨着數據量的增長而性能逐步惡化的困擾,性能問題一般被認爲是因爲磁盤容量或者內存等的規格引發的,

但其實是因爲SQL處理,也就是「實行計劃」沒有被正確編寫引發的。

實行計劃就是執行SQL時,數據庫內部是怎樣處理SQL的。 性能優化

例如,是否使用索引,多張表存在的時候使用什麼順序結合等。 session

起初編寫的實行計劃並不必定是最好的。例如附加的索引沒有被使用到。 oracle

記錄的行數不多時,使用全面搜索更快一些,但若是使用索引,性能的問題就產生了。

那麼,怎麼才能正確的作成實行計劃呢? 工具

雖然有SQL的修正和追加索引等手段,但在這以前最重要的是「取得最新的統計信息」。 性能

統計信息是記錄各表的記錄行數和數據分佈的信息。 測試

因爲實行計劃是基於統計信息決定的,隨着數據的增長,性能降低,取得記錄數等最新的統計信息,使實行計劃最正確,提升性能。

使用SI Object Browser更新統計信息參照如下方法。 優化

1.對象列表中,在表顯示的狀態下按「Ctrl+A」,選中全部表。(也能夠選中處理較慢的SQL所參照的表。)

2.表被選中的狀態下點擊鼠標右鍵,選擇「統計信息」。

3.統計信息畫面顯示出來,選中「修正正確的信息」,點擊「OK」。



如今只支持Oracle版本,「在對象列表中表示詳細信息」可使詳細信息在對象列表中顯示。

選擇「工具」菜單-->「選項」選項卡。

「對象列表」-->「表示對象固有的詳細信息」設置成ON。  


「表示」菜單-->「表示更新」。

這個設置有使表的記錄數列表顯示的優點。 


統計信息的更新並非對應用進行修正,更新統計信息以後還不能解決問題的話,建議使用SQL優化等其

他手段。咱們接下來就講一下SQL的優化。


  • 2、SQL優化
性能惡化的緣由多數是由於SQL,此次要說明怎樣使SQL最優化。
SQL最優化就是「使內存獲得最有效的利用」。

在數據庫中有叫「程序庫緩存」和「數據庫緩衝」的內存區域,這些內存主要用於緩存。

把數據的讀取做爲例子,因爲數據存儲在硬盤的數據文件中,想要讀取數據必需要有權限訪問硬盤。
可是,讀取硬盤上的文件須要時間,在數據庫訪問硬盤的時候,內存也在拷貝一樣的數據,在第二次以後,只從內存就能夠讀取數據,提升了處理速度。這種結構就叫作緩存。

可是,第二次之後並不必定能使用緩存。因爲內存大小是有限制的,當容量過大時則不能登陸內存。或者緩存的數據將按照由舊到新的順序被刪除。

也就是說性能惡化的緣由多數是因爲數據增長,致使從訪問內存轉換到訪問硬盤。活用內存緩存,使處理速度恢復到從前,這就是性能優化。

具體方法有增長內存,改變初始化參數等,也能夠修改SQL文改善緩存。如下介紹兩種方法。


使用提示句

不使用索引讀取數據時(全表搜索),若是須要很大的內存致使不能訪問緩存中的數據,緩存的功能就無效了。 
上回說到,「取得最新的統計信息」方法可使實行計劃獲得改善,若是在SQL文中追加如下的提示句也許會更好。

SELECT /*+ INDEX (表名索引名)*/列名 FROM 表名
在SELECT的後面加上「/*+ INDEX (表名索引名)*/」。這樣就能夠明確的命令數據庫「要使用索引」。

SI Object Browser中使用「實行計劃」或者是「索引顧問」功能能夠查詢索引是否被使用,或者性能有多大的改善。
這裏特殊說一下,不少DBA最喜歡着眼於這個實行計劃和索引INDEX。
若是你看到下面這個界面,是否是以爲不用麻煩別人了?

在執行一條SQL以後,系統提示你已經建立了哪些INDEX,並且其中哪些使用了,哪些沒使用。
系統同時提示你還須要建立哪些INDEX,並且不須要你手動建立,下面的[建立]按鈕一下搞定。
想知道建立以後有沒有效果?點一下[測試]按鈕就OK。


使用綁定變量

執行SQL時,數據庫內部爲了做成SQL實行計劃必需要進行SQL解析,這樣就會消耗CPU資源。
一般,SQL若是和過去實行過的SQL同樣的話,經過程序庫緩存就能夠直接使用之前的解析結果。
例如,「SELECT * FROM SCOTT.EMP WHERE EMPNO = 1」和「SELECT * FROM SCOTT.EMP WHERE EMPNO = 2」是不一樣的SQL,則不能使用緩存功能。

不把SELECT語句的WHERE條件和INSERT語句插入的各項目的值設置成固定值,而是像「SELECT * FROM SCOTT.EMP WHERE EMPNO = :EMPNO」這樣把值的部分設置成變量。
這個變量就是綁定變量。
使用綁定變量,由於SQL問變成了同樣的,因此可使用緩存功能。
綁定變量還能夠從存儲過程,應用發行SQL。如下的代碼是以C#爲例子,也支持除此以外的主要的程序語言。

//向Order表插入數據
SqlCommand cm = new SqlCommand(sql, cn);
stringsql = "INSERT INTO ORDER(";
sql += "OrderNo,";
sql += "CustomerNo,";
sql += "Price)";
sql += "VALUES ";
sql += "( @OrderNo ,";
sql += "@CustomerNo,";
sql += "@Price)";
cm.CommandText = sql;

//設置各綁定變量的值
cm.Parameters.Add(new SqlParameter("OrderNo", lblOrderNo.Text));
cm.Parameters.Add(new SqlParameter("CustomerNo", lblCustomerNo.ToString()));
cm.Parameters.Add(new SqlParameter("ShippingCharge", lblPrice.Text));
//實行SQL
cm.ExecuteNonQuery();

即便是這樣還不能改善性能時,要考慮減輕訪問硬盤的負荷,增長內存等方法。
首先要最優化比較容易的SQL。
接下來咱們再講一下其餘致使性能惡化的緣由以及優化方法。


  • 3、讓緣由具體化
上面說性能惡化的緣由多數是由於SQL。接下來將要說明若是修正SQL還不能解決問題的話,使用其餘的解決辦法。

在Oracle中,發生等待時間緣由的事件名和等待時間存在於字典視圖中,調查下面的字典視圖能夠獲得緣由。

・V$SYSTEM_EVENT…顯示數據庫啓動後發生的待機事件
・V$SESSION_EVENT…顯示現行的session中所有的待機事件
・V$SESSION_WAIT…顯示session正在待機中仍是待機完了以後的事件

例如想要經過V$SYSTEM_EVENT調查時,使用如下的SQL文。
========================================================
SELECT EVENT, WAIT_CLASS, TOTAL_WAITS, AVERAGE_WAIT  
FROM V$SYSTEM_EVENT
WHERE WAIT_CLASS ! = 'Idle'
========================================================

WAIT_CLASS列是'Idle'事件時,也就是空閒時間(等待用戶請求的時間),不能做爲性能惡化的緣由,因此在WHERE中要除去'Idle'。

實行上述SQL後,EVENT列中表示事件名,TOTAL_WAITS列中表示總待機時間,AVERAGE_WAIT列中表示平均待機時間,這之中時間長的事件名就是性能惡化的緣由。

下記是具備表明性的待機事件和解決方法。
1. db file scattered read/db file sequential read
經過全表搜索,索引搜索讀取時發生。
【對策】改善SQL實行計劃。

2. direct path write/direct path write temp
磁盤排序處理時花費的等待時間。
【對策】內存有效排序。

3.在「Library」中開始待機事件(log buffer space等)
與程序庫緩衝關聯的待機事件。
在載入工程的時間和多進程等同時訪問時發生。
【對策】減小程序庫緩存錯誤

4.在「log buffer」中開始待機事件(log buffer space等)
與日誌文件關聯的待機事件。Check point和寫入慢時發生。
【對策】增長日誌文件大小,增長日誌文件組。

各類事件的詳細內容請參照oracle如下講解:
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05771-04/waitevents.htm#12032
在V$SYSTEM_EVENT視圖中記錄了數據庫從啓動開始到如今的待機事件,有可能不能肯定最近的性能惡化的緣由。
這時,使用V$SESSION_EVENT視圖,比較現象發生前和發生後的差異,就能獲得確切的緣由。
性能惡化剛剛發生的話,也可使用V$SESSION_WAIT。

這就是幾乎所有有關oracle性能優化的基礎了。
性能優化看起來比較難,可是掌握了關鍵點的話誰都能操做。
很是但願能給你們帶來幫助,若是有問題歡迎隨時交流!
相關文章
相關標籤/搜索