天天看點

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    開發中或者是正在運作的系統性能顯著惡化的場合,需要進行性能優化。當聽到性能優化時,有些人可能會感覺到非常困難,如果利用圖形化界面的第三方工具,通過使用索引或者記憶體等可以非常簡單的進行性能優化。這篇文章将以Object Browser為例來介紹怎樣簡單的優化資料庫性能。

性能優化是什麼

EC系統的“3秒鐘規則”

    假設在EC網站上,通路網站的顧客都必須要等待三秒鐘的響應時間,這個時間被稱為“3秒鐘規則”。如果響應時間在三秒鐘以上的話,顧客就會認為這個網站服務慢,有可能會導緻商業機會的丢失。不用說EC網站的例子,為了有效的推行業務,系統的性能是非常重要的。系統中并不僅僅要安裝重要的功能(功能需求),還必須要知道響應時間是多少,機關時間内電腦的處理量、通信線路的資料傳送量等(非功能需求)。

    資料庫即使是在系統開發的後端,也有調整響應時間的性能優化。資料庫性能優化就是針對響應時間非常慢的場合實施的對策。OB有很多功能支援性能優化。

性能優化的流程

     以下是包含資料庫的一般的性能優化的流程。

    1.  調查

        性能優化首先要從性能測定和找到産生問題的地方開始。要把系統構成和應用設計作為優化對象進行确認和測定,調查延遲原因。

        測定方式除了響應時間之外,還可以檢視SQL實行計劃中“cost”使用量。

    2.  設定目标值

        接下來,我們要知道要把性能改善到何種程度。進行性能優化有很多種手段,要是全部實施的話将是沒完沒了的,是以最重要的是設定目标值。

        要考慮系統至少需要把性能調整到何種程度,例如EC網站要把響應時間縮短到3秒以内等等。

    3.  研究改善對策

        決定了目标之後就要研究改善對策了。應用邏輯有問題的話就把算法修改成更高效的,SQL有問題的話就把表的關聯盡量減少。

        還有給表設定合适的索引,把外部的應用處理用存儲過程的形式。盡量找到達成目标的最有效的方法。

    4.  實施/調整

        決定了改善對策之後,進入實施階段,看能否達成目标。如果目标達成了,性能優化就成功了。也有實施對策之後沒有達成目标的情況,這時就要重複一遍以上的步驟,改變改善對策。

        假如有多個改善對策的話,可以改變改善方法或者是追加改善方法。也許還會遇到其他的瓶頸,這時要傳回去重新進行原因分析。在達成目标之前,以上的步驟要循環1~4圈。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

圖1:性能優化順序

        所謂瓶頸就是資料庫伺服器的記憶體不足,或者SQL的處理速度等資料庫外部的性能調整。本篇文章介紹如何使用OB進行資料庫優化。

SQL處理速度的改善(優化索引)

    最初運作良好的系統突然變的非常慢,這通常被認為是因為資料的增加使響應速度降低。像這種場合,“優化索引”多次發揮了效果。

    優化索引就是給表做成合适的索引,改善性能的方法。如果表中沒有索引的話,檢索時就是從表所有資料中進行搜尋(全表搜尋)。進行全表搜尋時,如果資料量很大的時候通路速度就會非常慢。這時,如果給表設定合适的索引的話,從大量的資料中有目的的高效的進行搜尋,這就可以改善性能。以下是一般優化索引的順序和OB的功能。

    1.  抽出運作慢的SQL-->SQL緩存

    2.  測量SQL的性能-->實行計劃

    3.  做成合适的索引-->索引顧問

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

圖2:索引優化順序

    使用“SQL緩存”找到SQL性能低下的原因。用“實行計劃”測量性能。用“索引顧問”決定改善對策。

抽出速度慢的SQL  “SQL捕捉”

    接下來要具體介紹“SQL捕捉”的操作方法。為了進行索引優化,首先要從所有的SQL文中找到速度慢的SQL。

    SQL捕捉,是跟蹤SQL一覽表示處理速度和測定結果的功能。此功能在“工具”菜單的“SQL捕捉。

    SQL捕捉是為了調查正在運作的SQL所實施的跟蹤。跟蹤就是對正在運作的SQL的記錄。初次啟動SQL捕捉時,顯示的是跟蹤檔案存在的檔案夾對話框。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    關于跟蹤檔案夾一定要指定成Oracle資料庫伺服器上跟蹤檔案存在的檔案夾。通常是“Oracle Home/ADMIN/ORCL/UDUMP”。

    一定要指定成資料庫伺服器上的檔案夾。安裝OB的用戶端機器和資料庫伺服器不同場合,利用作業系統的網絡共享功能,指定成用戶端和伺服器都能參照的檔案夾。

    TIPS 想要變更跟蹤檔案存在的檔案夾時

    在主菜單的“SQLcatch”à“選擇跟蹤檔案夾”中指定即可。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    指定了跟蹤檔案夾之後,SQL緩存畫面就表示出來了。

    SQL跟蹤的結果被做成日志檔案儲存在剛剛設定的檔案夾内。

    點選畫面左上角的“開始”按鈕,開始跟蹤。顯示跟蹤實行畫面,我們要指定對資料庫全體進行跟蹤還是對個别session進行跟蹤。如果要對個别session進行跟蹤的話,要選擇想要調查的應用對應的session,并且還要在應用中執行登入操作等,做成資料庫session。

    如果選擇對資料庫全體進行跟蹤的話,就是對所有的session進行跟蹤。但是,要把初期化參數“SQL_TRACE”設定成TRUE。

    跟蹤開始後,可以回到應用頁面進行操作。例如,EC網站中商品檢索畫面緩慢的話,可以執行商品檢索操作。這時,正在運作的SQL會記錄在跟蹤日志中。

    操作完成之後,傳回到OB,點選“停止”,停止跟蹤,接下來确認一下跟蹤結果。點選SQL緩存畫面的“表示”按鈕,跟蹤結果畫面顯示出來。

              COUNT:SQL文實行或者是解析的次數

              CPU:SQL進行解析/實行/取得操作,CPU耗費的時間

              ELAPSED:經過時間

              DISK:實行中讀出實體塊的次數

              QUERY:SQL語句要求的總讀取次數

              CURRENT:SQL語句要求的正在執行的讀取次數

              ROWS:實行中處理的行數

              SQL:實行的SQL文

    CPU列代表處理速度,點選這些列使他們按照處理速度排序,找到速度慢的SQL。

測量SQL的性能

    找到速度慢的SQL之後,在SQL實行畫面的“實行計劃”功能可以測量SQL的性能。

    “實行計劃”就是在SQL實行之前資料庫内部進行的處理。例如,如果是SELECT的話,多表結合的方法、順序,是否使用索引取得資料,這些都是基于資料庫内部的資訊決定的。在資料庫内部具有決定實行計劃功能的部分叫做“優化器”。

    在SQL實行畫面中點選“實行計劃”按鈕,“實行計劃”按鈕是on的狀态時,輸入SQL文,點選“實行” 按鈕,此時進行的是SQL解析,實行計劃表示出來。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    TIPS  從SQL緩存畫面也可以取得實行計劃

    在SQL緩存畫面選中某行點選滑鼠右鍵,從彈出的對話框中選擇“實行計劃”即可。

    在這之中,索引優化最重要的是以下兩點。

    COST

    實行計劃最右面的列就是COST。COST就是資料庫處理SQL的負荷,是一項性能名額。COST的機關不是秒,1COST相當于多少秒是受伺服器的硬體影響的,是以不能進行嚴密的換算,可以相對的進行比較。例如,實際上系統的響應時間是30秒,目标值是3秒,隻需把COST值縮小10倍就可以了。

    是否使用索引

    進行全表搜尋時(沒有使用索引的場合),實行計劃的行是紅色的。這樣就可以知道還可以進行索引優化。

做成合适的索引 “索引顧問”

    從實行計劃得知沒有使用索引時,可以使用OB的索引顧問功能做成索引。如果不使用索引顧問還可以在索引畫面手動做成,但是并不是索引使用的越多就越好。

    例如“書籍”表,索引是“目次”。一般讀者隻想讀書的一部分的話,首先要參照目次,找到想看的内容的頁數。但是如果書隻有20幾頁的話,讀者就不需要看目次,直接找到相應的頁數。反過來,如果目錄有100多頁的話,誰也不會使用這麼麻煩的東西。

    決定實行計劃的優化器也認為當記錄數很少的時候最好不要使用索引。并且,當索引對象的列很多的時候,因為索引占的空間很大,也不要使用索引。為了作成合适的索引必須要考慮這些問題。但是,使用OB的索引顧問的話,即使不知道這些規則,也可以做出合适的索引。

在使用索引顧問之前

    要使用索引顧問,需要做兩項準備工作。第一個是作成足夠的資料。

    前面說到,判斷使用索引還是沒有使用索引的重要的名額就是資料量。是以,當資料很少時,要使用資料生成工具生成一些資料。

    還有就是要擷取最新的統計資訊。優化器統計表的行數時并不是每次都使用COUNT文,而是從統計資訊中取得行數。如果統計資訊不是最新的話,優化器就不能做出最好的判斷。

    擷取最新的統計資訊的方法是,在對象清單中選中一個表點選滑鼠右鍵,選擇“統計資訊”,更新畫面顯示出來。點選“開始”就能取得最新的統計資訊。Ctrl+A可以選中所有表。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    在統計資訊畫面有很多選項,因為我們的目的是優化索引,是以選擇“收集精确的統計資訊”。

    TIPS  基于規則、基于COST

    Oracle的優化器有基于規則和基于COST兩種模式。上面說到優化器決定實行計劃的時候要考慮記錄數,這嚴密的說應該是基于COST場合需要做的。當實行計劃是基于規則,則不用考慮記錄數,需要遵循一定的規則做出實行計劃,例如,使用WHERE句的列是否包含在索引的對象列中。

    優化器的模式是基于規則的時候,不需要做成資料和更新統計資訊,一般不推薦使用基于規則的模式。剛才圖書的例子,參考統計資訊的基于COST的方法更好一些。是以,在Oracle10g以後,OB廢棄了基于規則的優化器模式。

    使用哪個模式可以在初期化參數“OPTIMIZER_MODE”中查詢。

    準備工作完成之後,啟動索引顧問。“工具”-->“索引顧問”。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    在索引顧問畫面有“輸入SQL”,“現在的索引”,“做成的索引”3部分。首先在最上方的“輸入SQL”欄中寫入要優化的SQL。索引顧問頁面和SQL實行畫面一樣,有履曆管理的功能。因為這個履曆和SQL實行畫面的履曆是共有的,是以想在SQL實行畫面查詢實行計劃的話,點選“前”或者是“履曆”按鈕,就可以呼出同樣的SQL。

    SQL輸入完成後,點選“解析”按鈕,在頁面中間的“現在的索引”欄内表示的是表和附加在表上的索引的使用狀況。沒有被使用的索引用紅色表示,如果索引不需要了,可以用DELETE鍵或者點選滑鼠右鍵“消除”進行删除。

    在頁面下面的“做成的索引”欄中表示的是每個表中被認為是有用的索引。這個欄中表示的是沒有被做成的索引,選擇一項點選“做成”按鈕,索引就被做成了。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    但是,我們不知道這樣做成的索引是否一定被使用。

    索引顧問是解析SQL,得出候補的索引,但是根據記錄數的不同,做成的索引是否被優化器使用是不一樣的。是以,OB有了比較索引做成前後的COST數的功能。點選“測試”按鈕,得到索引做成前和做成後的COST數。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    如果做成前和做成後的結果不一樣的話,就證明使用了索引。如果結果沒變的話,就是即使做成了索引也沒有被使用。和實行計劃功能一樣,性能是用COST表示的,不僅僅是索引的使用狀況,根據變化也可以知道性能提高了多少。使用者可以按照候補索引的順序依次測試,選擇結果最好的索引。

    索引做成之後,會自動進行再解析,最後做成的索引會出現在“現在的索引”欄目中,請确認索引是否被使用。

    到此為止索引優化就完成了。

    TIPS 不要使用過多的索引

    是每個SQL決定索引是否被使用,最合适的索引是什麼依據SQL的不同而不同。一個表不可能隻對應一種SQL。即使是不常被更新的主表,除了從管理工具通路之外,還可能和事務内的其他表結合。如果做成多個SQL共同使用的索引很困難的話,那麼就給一個表設定多個索引。

    但是,索引過多也不好。索引在表中的資料更新的同時會進行再構築,如果索引多時,就會增加表更新時的負荷。是以,最好是把想要改善性能的SQL和頻繁使用的SQL作為索引的對象。

資源的優化

    前面介紹的是通過優化SQL改善性能。如果是因為随着資料量的增加而導緻性能惡化的話,這些方法是有效的。但是也有可能是因為記憶體不足輸入輸出增加,CPU使用到達界限,資料庫伺服器的資源不足等。OB有改善這些問題産生的性能惡化的“資源優化”功能。資源優化按照下面的順序進行。

    1.  資源狀況測定 “性能資訊”

    2.  資源優化 “初期化參數變更”

    首先參照Oracle的系統統計和I/O統計等統計資訊,然後更改Oracle資源設定中初期化參數的資訊。

資源狀況測定

OB中使用“性能資訊”來調查資源不足的原因。“性能資訊”畫面在“管理”菜單中。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    性能資訊畫面有系統統計和I/O相關的統計等一些項目。重要的項目在前面用表示,選擇這個項目就會顯示項目的說明和改善方法。

    但是多數情況下是确認這些參數在性能剛開始降低時候的值,即使是有專業知識的專家在性能已經惡化的狀态下找出原因也是非常困難的。是以,OB提供了定期儲存性能資訊的功能。儲存性能良好時參數的值,這樣就可以和性能惡化時的參數值進行比較。

    這個功能在“工具”-->“選項”-->“詳細設定”中,選擇“DB連接配接結束時自動儲存”,設定儲存時間間隔。OB終了時如果到了儲存間隔的話就會把參數自動儲存起來。例如把儲存間隔設成30天的話,就是每30天進行一次儲存。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    被儲存起來的資訊在性能資訊畫面表示,可以把性能惡化前和惡化後的值進行比較。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

改善初期化參數

    在“性能資訊”中判定性能惡化的原因是記憶體等資源不足的情況下,可以使用改變初期化參數的方法進行性能改善。打開“管理”-->“資料庫資訊”,打開“初期化參數”頁籤。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    以下是和性能改善相關的具有代表性的參數。

   SGA_MAX_SIZE:SGA的最大值。SGA(System Global Area)是資料庫緩沖區高速緩存和共享池等伺服器程序使用的記憶體區。

   DB_CATCH_SIZE:資料庫緩沖區高速緩存大小。它的值越大,通路資料的速度越快。

   SHARED_POOL_SIZE:共享池的大小。它的值越大,程式庫緩存的命中率越高,SQL的實行速度越快。

   JAVA_POOL_SIZE:JAVA池的大小。它的值越大,JAVA存儲過程等的實行速度越高。

   SORT_AREA_SIZE:排序使用的記憶體容量。它的值越大,排序的速度越快。

   LOG_BUFFER:把REDO資訊寫入REDO日志檔案時使用的記憶體容量。它的值越大,寫入REDO日志檔案的等待時間就越少。

   根據Oracle版本的不同,這些項目有可能能修改也有可能不能被修改。“變更”列說明了是否能被修改。

   當變更的狀态是“可能”時,輕按兩下“值”,會出現變更對話框。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    “不能”的場合可以更改init.ora或者SPFILE等設定檔案,并重新啟動資料庫。

    修改初期化參數是性能優化中非常容易執行的方法,因為要增加Oracle使用的記憶體空間,是以要先确定伺服器剩餘的記憶體容量。

表通路的優化

表領域的分割

    最後介紹一下其他的優化方法。SQL的處理速度非常慢的時候嘗試用索引優化的方法,但是卻不能把性能提高到目标值。這時,可以使用提高表通路速度的組合分區的方法。

    分區是硬碟的讀取和寫入同時進行的技術。資料庫有表領域的概念,表領域實際上是和存放資料的作業系統上的檔案有關。表和表領域是從屬關系,一個表可能屬于一個表領域,但是如果進行分區的話,就可以把表分成幾個表領域存放。這樣就可以使讀取和寫入并列化,從末端改善表通路。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

分區的順序

    要做成表領域選擇“管理”菜單-->“表領域資訊”。在表領域一覽畫面點選“建立”按鈕,顯示建立畫面。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    至少要輸入的項目是“表領域名”,“檔案位址”,“大小”。“檔案位址”是伺服器上的位址。“大小”是知道表的容量之後設定的。除此之外的項目都不是必須設定的。設定完成後,點選“作成”按鈕,表領域就做好了。請按需要添加表領域的數量。

    TIPS  調查表領域所需的大小

    表領域必須的資料大小大概是表中各列資料的長度和總資料行數的乘積。但是,嚴密來說表的block size和INITRANS等表領域相關的設定也是有影響的。把這些也考慮進去計算表領域大小的工具是Oracle免費提供的。

http://otn.oracle.co.jp/document/estimate/index.html

“SI Object Browser ER”也提供了估算表領域大小的功能。

    表領域做成之後,在表畫面的“領域資訊”頁籤内進行設定。表做成時的存放方法是“通常”,這樣可指定的表領域就隻有一個,如果把存放方法改成“範圍分區”,“清單分區”,“散列分區”中的任何一個,就可以分區化。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    範圍、清單、散列的不同之處是各條資料配置設定方法的不同。分區的場合指定表中的一列是主鍵,根據主鍵對應的值把資料配置設定在各個分區中。以下是配置設定方法。

    範圍分區

    根據值的範圍存放在不同的表領域中的方法。指定上限值欄内各個表領域包含的資料的範圍來配置設定表領域。例如,當想根據價格等數值類型、日期類型配置設定表領域的時候使用。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    清單分區

    根據值指定表領域。例如,當想根據價格等數值類型、日期類型配置設定表領域的時候使用。當輸入的值是資料庫辨別等的時候使用。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    散列分區

    當不根據範圍和值,随機配置設定表領域的時候使用。“散列”就是通過“MD5”和“SHA-1”等算法從某個值生成特定的值的算法。在Oracle内部通過雜湊演算法生成值,并根據值配置設定表領域。當存放的值不一定的場合使用此方法。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    TIPS  綜合分區

    Oracle中有多種分區方法,我們還可以使用“範圍、清單分區”等兩種分區方法組合在一起的“綜合分區”。

    選擇了綜合分區之後,在分區設定欄的下邊會顯示叫“子分區”的設定欄。在子分區中可以指定值和表領域。

Oracle性能優化圖文詳解——利用第三方工具性能優化是什麼SQL處理速度的改善(優化索引)資源的優化表通路的優化

    但是,綜合分區的方法在Oracle8i以前的版本不能使用。9i和10g的版本隻可以選擇“範圍、清單分區”或者“範圍、散列分區”。11g沒有限制了,但是散列隻可以作為子分區設定,例如,是不能設定“散列、清單分區”方法的。是以現在可以設定的分區方式有6種,以下是可以組合的分區方式(橫列是子分區)。

清單 清單 散列
範圍 11g~ 9i~ 9i~
清單 11g~ 11g~ 11g~

    以上就是使用Object Browser進行的簡單的性能優化的方法。

要進行性能優化還有一些其他的方法,例如使用存儲過程或者是物化視圖。首先請先試試上面的方法吧。