天天看點

Oracle資料庫應用系統調優方法

從以下幾個方面:資料庫伺服器、網絡I/O、應用程式等對整個系統加以調整,充分發揮Oracle的效能,提高整個系統的性能 

  Oracle資料庫廣泛應用在社會的各個領域,特别是在Client/Server模式的應用,但是應用開發者往往碰到整個系統的性能随着資料量的增大顯著下降的問題,為了解決這個問題,從以下幾個方面:資料庫伺服器、網絡I/O、應用程式等對整個系統加以調整,充分發揮Oracle的效能,提高整個系統的性能。

  1 調整資料庫伺服器的性能

  Oracle資料庫伺服器是整個系統的核心,它的性能高低直接影響整個系統的性能,為了調整Oracle資料庫伺服器的性能,主要從以下幾個方面考慮:

  1.1 調整作業系統以适合Oracle資料庫伺服器運作

  Oracle資料庫伺服器很大程度上依賴于運作伺服器的作業系統,如果作業系統不能提供最好性能,那麼無論如何調整,Oracle資料庫伺服器也無法發揮其應有的性能。

  1.1.1 為Oracle資料庫伺服器規劃系統資源

  據已有計算機可用資源, 規劃配置設定給Oracle伺服器資源原則是:盡可能使Oracle伺服器使用資源最大化,特别在Client/Server中盡量讓伺服器上所有資源都來運作Oracle服務。

  1.1.2 調整計算機系統中的記憶體配置

  多數作業系統都用虛存來模拟計算機上更大的記憶體,它實際上是硬碟上的一定的磁盤空間。當實際的記憶體空間不能滿足應用軟體的要求時,作業系統就将用這部分的磁盤空間對記憶體中的資訊進行頁面替換,這将引起大量的磁盤I/O操作,使整個伺服器的性能下降。為了避免過多地使用虛存,應加大計算機的記憶體。

  1.1.3 為Oracle資料庫伺服器設定作業系統程序優先級

  不要在作業系統中調整Oracle程序的優先級,因為在Oracle資料庫系統中,所有的背景和前台資料庫伺服器程序執行的是同等重要的工作,需要同等的優先級。是以在安裝時,讓所有的資料庫伺服器程序都使用預設的優先級運作。

  1.2 調整記憶體配置設定

  Oracle資料庫伺服器保留3個基本的記憶體高速緩存,分别對應3種不同類型的資料:庫高速緩存,字典高速緩存和緩沖區高速緩存。庫高速緩存和字典高速緩存一起構成共享池,共享池再加上緩沖區高速緩存便構成了系統全程區(SGA)。SGA是對資料庫資料進行快速通路的一個系統全程區,若SGA本身需要頻繁地進行釋放、配置設定,則不能達到快速通路資料的目的,是以應把SGA放在主存中,不要放在虛拟記憶體中。記憶體的調整主要是指調整組成SGA的記憶體結構的大小來提高系統性能,由于Oracle資料庫伺服器的記憶體結構需求與應用密切相關,是以記憶體結構的調整應在磁盤I/O調整之前進行。

  1.2.1 庫緩沖區的調整

  庫緩沖區中包含私用和共享SQL和PL/SQL區,通過比較庫緩沖區的命中率決定它的大小。要調整庫緩沖區,必須首先了解該庫緩沖區的活動情況,庫緩沖區的活動統計資訊保留在動态性能表v$librarycache資料字典中,可通過查詢該表來了解其活動情況,以決定如何調整。

Select sum(pins),sum(reloads) from v$librarycache; 

  Pins列給出SQL語句,PL/SQL塊及被通路對象定義的總次數;Reloads列給出SQL 和PL/SQL塊的隐式分析或對象定義重裝載時在庫程式緩沖區中發生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區的命中率合适;若sum(pins)/sum(reloads)>1,

則需調整初始化參數 shared_pool_size來重新調整配置設定給共享池的記憶體量。

1.2.2 資料字典緩沖區的調整

  資料字典緩沖區包含了有關資料庫的結構、使用者、實體資訊。資料字典的命中率,對系統性能影響極大。資料字典緩沖區的使用情況記錄在動态性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調整。

Select sum(gets),sum(getmisses) from v$rowcache; 

  Gets列是對相應項請求次數的統計;Getmisses 列是引起緩沖區出錯的資料的請求次數。對于頻繁通路的資料字典緩沖區,sum(getmisses)/sum(gets)<10%~15%。若大于此百分數,則應考慮增加資料字典緩沖區的容量,即需調整初始化參數shared_pool_size來重新調整配置設定給共享池的記憶體量。

  1.2.3 緩沖區高速緩存的調整

  使用者程序所存取的所有資料都是經過緩沖區高速緩存來存取,是以該部分的命中率,對性能至關重要。緩沖區高速緩存的使用情況記錄在動态性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調整。

  Select name,value from v$sysstat where name in 

  (&#39;dbblock gets&#39;,&#39;consistent gets&#39;,&#39;physical reads&#39;); 

  dbblock gets和consistent gets的值是請求資料緩沖區中讀的總次數。physical reads的值是請求資料時引起從盤中讀檔案的次數。從緩沖區高速緩存中讀的可能性的高低稱為緩沖區的命中率,計算公式:

Hit Ratio=1-(physical reds/(dbblock gets+consistent gets)) 

  如果Hit Ratio<60%~70%,則應增大db_block_buffers的參數值。db_block_buffers可以調整配置設定給緩沖區高速緩存的記憶體量,即db_block_buffers可設定配置設定緩沖區高速緩存的資料塊的個數。緩沖區高速緩存的總位元組數=db_block_buffers的值*db_block_size的值。db_block_size

的值表示資料塊大小的位元組數,可查詢 v$parameter 表:

select name,value from v$parameter where name=&#39;db_block_size&#39;; 

  在修改了上述資料庫的初始化參數以後,必須先關閉資料庫,在重新啟動資料庫後才能使新的設定起作用。

  1.3 調整磁盤 I/O

  磁盤的I/O速度對整個系統性能有重要影響。解決好磁盤I/O問題,可顯著提高性能。影響磁盤I/O的性能的主要原因有磁盤競争、I/O次數過多和資料塊空間的配置設定管理。

  為Oracle資料庫伺服器建立新檔案時,不論是表空間所用的資料檔案還是資料事務登入所用的日志檔案,都應仔細考慮資料庫伺服器上的可用磁盤資源。如果伺服器上有多個磁盤,則可将檔案分散存儲到各個可用磁盤上,減少對資料庫的資料檔案及事務日志檔案的競争,進而有效地改善伺服器的性能。對于不同的應用系統都有各自的資料集,應當創見不同的表空間分别存儲各自應用系統的資料,并且盡可能的把表空間對應的資料檔案存放在不同的磁盤上,這種從實體上把每個應用系統的表空間分散存放的方法,可以排除兩個應用系統競争磁盤的可能性。資料檔案、事務日志檔案分别存放在不同的磁盤上,這樣事務處理執行的磁盤通路不妨礙對相應的事物日志登記的磁盤通路。如果有多個磁盤可用,将兩個事物日志成員放在不同的磁盤驅動器上,就可以消除日志檔案可能産生的磁盤競争。應把一個應用的表資料和索引資料分散存放不同表空間上,并且盡量把不同類型的表空間存放在不同磁盤上,這樣就消除了表資料和索引資料的磁盤競

1.4 調整資料庫伺服器的復原段

  復原段是一個存儲區域,資料庫使用該存儲區域存放曾經由一個事務更新或删除的行的原始資料值。如果使用者要復原一個事務所做的改變,那麼資料庫就從復原段中讀回改變前的資料并使該事務影響的行改變為它們的原狀态。復原段控制着資料庫處理事務的能力,因而在資料庫成功中起着關鍵性的作用,不管資料庫的其它部分設計得多好,如果它設計得不合理,将會嚴重影響系統的性能。建立和調整復原段的原則如下。

  1.4.1 分離復原段

  分離復原段是指單獨為復原段建立一個以上的表空間,使復原段與資料字典、使用者資料、索引等分離開來。由于復原段的寫入與資料和索引的寫入是并行進行的,是以将它分離出來可以減少I/O争用。如果復原段與資料不分離,倘若要某個表空間脫機或撤消,那麼在該表空間中的各個復原段沒有全部脫機之前,不能将這個表空間脫機或撤消。而一旦該表空間不可用,則該表空間中的所有復原段也不能使用,這将浪費所有配置設定的磁盤空間。是以,獨立復原段可使資料庫管理變得容易。復原段的經常性收縮,使得表空間的自由塊更容易形成碎片。分離復原段可以減少資料庫表空間的碎片産生。

  1.4.2 建立不同大小的復原段群

  對于一些聯機事物處理,他們一般是頻繁地對少量資料進行修改,建立許多小的復原段對之有利。每一個事物的入口項隻能限于一個復原段,復原段應該充分大以容納一個完整的事物處理,是以對一些較大型事物,需要較大型的復原段。極個别脫機處理事物會産生大量的復原資訊,這時需要一個特大号的復原段來處理。根據這些理論,在Oracle資料庫伺服器中針對上述3種事物處理建立三組:小事物組、較大事物組、特大事物組等大小不同的復原段群,并且将之分散到3個不同的表空間上,群内大小相同,應能滿足該組事物處理的最大要求。

  1.4.3 建立數量适當的復原段

  一般復原段數量與并發事物個數有關,以下給出由于并發事物個數而應建立復原段的參考數:

  并發事物(n)   復原段數

  n<16        4

  16 ≤ n<32     8

  n≥ 32      n/4

  2 調整Client/Server模式下的網絡I/O

  Client/Server環境中的應用處理是分布在客戶應用程式和資料庫服務程式之間的。在 Client/Server環境中Client與Server之間的網絡I/O是整個系統性能提高的瓶頸,一個客戶應用程式引起的網絡I/O越少,應用及整個系統的性能越好。減少網絡I/O的最重要的一條原則:将應用邏輯集中在資料庫伺服器中。

  2.1 使用Oracle資料庫的完整限制性

  當為應用建表時,應當為一些有特殊要求的資料加上适當的完整性限制,這樣就能實作由資料庫本身而不是應用程式來限制資料符合一定的條件。資料庫伺服器端的完整限制的執行操作是在比SQL語句級别更低的系統機制上優化,它與用戶端無關,隻在伺服器中運作,不需在Client 端和Server端之間傳遞SQL語句,有效地減輕網絡I/O負擔。

 2.2 使用資料庫觸發器

  完整限制性隻能實作一些較簡單的資料限制條件,對一些較複雜的事物處理規則就無能為力,這時最好不要在應用程式中實施複雜的程式控制,而是應當采用資料庫觸發器來實施複雜的事物規則。資料庫觸發器能實作由資料庫本身,而不是應用程式,來限制資料符合複雜的事物處理規則,并且容易建立,便于管理,避免大量的網絡I/O。

  例如:将目前表A中成為曆史的記錄從A表中轉儲到曆史表B中,表示為Lsbs。

  在應用程式中實作:       用資料庫觸發器實作:

  Beign              Create trigger delete1

  Update A set lsbs=&#39;T&#39;;      After update of lsbs on A

  Insert into B          For each row

  Select * from A where lsbs=&#39;T&#39;; Insert into B

  Delete A where lsbs=&#39;T&#39;;     select * from A where :new.lsbs=&#39;T&#39;;

  End;               Delete A where :new.lsbs=&#39;T&#39;;

  End delete1;

  在應用程式中實作時,所有的SQL指令請求傳送的資料都要通過網絡在Client端和Server端進行交換,而不像資料庫觸發器一樣,SQL本身在Server端,不需要通過網絡傳輸資料。當進行操作的資料量相當大時,并且多個使用者同時操作時,通過在應用程式中實作複雜的控制,必将增大網絡I/O的負荷,使整個系統的性能降低,而用資料庫觸發器能完全避免這種情況發生。

  2.3 使用存儲過程、存儲函數和包

  Oracle的存儲過程和存儲函數是命名的能完成一定功能并且存儲在Server端的PL/SQL的集合。包是一種把有關的過程和函數組織封裝成一個資料庫程式單元的方法。它們相對于應用程式的過程、函數而言,把SQL指令存儲在Server端。使用存儲過程和存儲函數,應用程式不必再包含多個網絡操作的SQL語句去執行資料庫伺服器操作,而是簡單調用存儲過程和存儲函數,在網絡上傳輸的隻是調用過程的名字和輸出結果,這樣就可減少大量的網絡I/O。

  例如:基表A、B的定義:name char(20);detail char(10);A表100萬記錄,應用程式将從基表A中檢索detail列符合給出條件的記錄,并将之插入基表B。

  Declare 

  Cursor cursor1 is select*from A;poin cursor1%type; 

  con1 number(2);res1 char(4)=&#39;abcd&#39;; 

  Begin Insert into B values(poin.name,poin.detail);end if; 

  For poin in cursor1 loop   End loop;End loop; 

  For con1 in 1..7 loop    Commit; 

  If substr(poin.detail ,con1,4)=res1 then End; 

  如果在Developer/2000 From中按鈕觸發器直接用PL/SQL實作和把它改寫為一個Oracle存儲過程,然後在From中調用此過程實作比較,後者性能顯著提高。

  在考慮使用上述3種方法時:首先考慮使用完整限制性。對于資料庫觸發器和存儲過程,如果需要所有通路資料庫的程式自動實施一定規則或檢查,那麼使用資料庫觸發器;如果隻需對少數的程式實施一定的規則或檢查,則可建立一個過程,讓有關程式調用這個過程。

3 應用程式的調整

  3.1 SQL語句的優化

  SQL語句的執行速度,可以受很多因素的影響而變化。但主要的影響因素是:驅動表、執行操作的先後順序和索引的運用。可以由很多不同的方法間接地改變這些因素,以達到最優的執行速度。這裡主要探讨當對多個表進行連接配接查詢時應遵循的優化原則:

  (1) 用于連接配接的子句的列應被索引、在Where子句中應盡量利用索引,而不是避開索引。 

  (2) 連接配接操作應從傳回較少行上驅動。 

  (3) 如果所連接配接的表A和B,A表長度遠遠大于B表,建議從較大的A表上驅動。 

  (4) 如果Where子句中含有選擇性條件,Where No=20,将最具有選擇性部分放在表達式最後。 

  (5) 如果隻有一個表有索引,另一表無索引,無索引的表通常作為驅動表。如A表的No列以被索引,而B表的No 列沒被索引,則應當B表作為驅動表,A表作為被驅動表。 

  (6) 若用于連接配接的列和Where子句中其他選擇條件列均有索引,則按各個索引對查詢的有效性和選擇性分别定出級别,結合表中具體資料構成情況,從中選出優化路徑,一般需要考慮:子句中哪些列可以使用索引、哪些索引具有唯一性及被查詢表行數目等。 

  3.2 建立和使用視圖、索引

  利用視圖可以将基表中的列或行進行裁減、隐藏一部分資料,并且能夠将涉及到多個表的複雜查詢以視圖的方式給出,使應用程式開發簡潔快速。利用索引可以提高查詢性能,減少磁盤I/O,優化對資料表的查詢,加速SQL語句的執行。但任何時候建立索引都能提高性能,何時建立索引應當遵循以下原則:該表常用來在索引列上查詢,該表不常更新、插入、删除等操作,查詢出來的結果記錄數應控制在原表的2%~4%。

  3.3 使用Oracle的數組接口

  當一個客戶應用程式插入一行或用一個查詢來向伺服器請求某行時,不是發送具有單個行的網絡包,而是采用數組處理,即把要插入的多個行或檢索出的多個行緩沖在數組中,然後通過很少的幾個包就可在網上傳送這些數組。例如,一個給定的Select語句傳回2000行資料,每行平均大小為40個位元組,資料包的大小為4kB,而數組大小參數(arraysize)設定為20,則需從伺服器發送100個資料包到客戶機。如果簡單地把(arraysize)設定為2000,那麼同樣的操作隻需要傳送20個資料包。這樣就減少了網絡的傳輸量,提高了所有應用的性能。

  4 總結

  我們在開發應用程式時,遵循上述的方法和原則,對系統進行調整,收到了令人滿意的效果。但是應當指出,由于客戶機、網絡、伺服器這3個互相依存的組成部分都必須調整和同步才能産生最佳的性能,是以還應根據系統的具體情況,具體分析和調整。

原文連結:

http://bbs.tech.ccidnet.com/forum.php?mod=viewthread&tid=593245&extra=page%3D1