java系統性能調優


這是我前幾天整理的一篇 數據庫優化的文章,貼出來與大家共享。

 

據統計,以數據庫為中心的應用程序80%的性能問題是低效的SQL語句引起的,所以SQL的性能優化顯得十分重要。另一方面,Oracle數據庫應用系統運行階段,DBA(數據庫管理員)對系統參數配置不合理導致數據庫運行性能低下,再者數據庫物理結構的不合理也是導致性能低下的原因,本文主要從這些方面展開對oracle數據庫應用性能的討論。[2]

 

1. SQL優化

1.1 索引提升性能

Oracle采用 2種訪問表中記錄的方式:全表掃描和通過

ROWID訪問表。全表掃描就是順序的訪問表中每條記錄,該掃描方式耗費的時間和系統資源均較高;通過ROWID訪問表,ROWID包含了表中記錄的物理位置信息,Oracle采用索引(Index)實現了數據和存放數據的物理位置(ROWID)之間的聯系,索引提供了快速訪問ROWID的方法。

通過在許多情況下,針對數據表中的某個字段創建索引可以很快查詢到所需的數據,一般來說應遵循以下基本原則:

(1)該字段是否為關鍵字,主鍵和外鍵須添加索引。

(2)為經常出現在關鍵字ORDER BY、GROUP BY、DISTINCT后面的字段,建立索引。

(3)對經常與表進行連接的表的連接字段建立索引。

索引雖有助於提高性能,但並不是索引越多越好,過多的索引會導致系統低效,用戶在表中每加進一個索引,維護索引集合就要做相應的更新工作,加重相應的更新代價。[3]

 

1.2 SQL語句優化

SQL語句優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充分利用索引來減少表掃描的I/O次數,盡量避免表搜索的發生。優化的目的就是將性能低下的SQL語句轉換成目的相同的、性能優異的SQL語句,使數據查找的路徑最簡化,並盡量保持處理器時間和I/O時間的平衡。通常分為以下幾個步驟:1)查找有問題的SQL語句。優化有問題的sql語句能顯著提高數據庫性能。尋找的方法有:搜集統計數據,oracle中可以通過DBMSSTATS包或ANALYZE命令,前者

可用於搜集有關鏈接數據行的統計數據,簇的數據情況只能使用ANALYEZ命令獲得,其相關語法為ANALYEZE CLUSTERCluste_name ComputerSTATISTICS,對於其它情況可以使用DBMS_SATS包,語法為:execDBMS_SATS.gather_table_stats(‘owname’,’tablename’,’partnmae’);利用SQLTrace工具分析SQL語句。通過命令ALTER SESSION SET SQL_TRACE=TRUE會話激活SQL_TRACE,oracle就會在udump管理區創建跟蹤文件,從而可以了解如解析、執行和返回數據的次數、CPU時間和執行時間、物理讀和邏輯讀操作次數、庫緩沖區命中率等參數;通過oracleEnterpriseManager Console、Oracle Diagnostics Pack等圖形性能工具能夠很快地獲取到數據庫緩沖區命中率、CPU利用率、運行時內存等重要的數據庫性能指標信息,並將它們以GUI表格形式和曲線圖形式顯示出來;2)建立合適的SQL語句。參照原則如下:建立“適當”的索引,使用索引的根本目的就是為了提高查詢效率,但索引也不是越多越好,使用索引時應遵循相應的原則。此外,為了降低I/O競爭,索引不應與用戶表空間建在同一磁盤上;避免使用耗費資源的操作如DSJTNITC、UNION、GROUP BY、ORDERBY等關鍵字,因為他們會啟動SQL引擎執行耗費資源的排序功能。[4]

 

2. 數據庫應用系統參數優化

2.1 調整服務器內存分配

服務器內存分配是在應用系統運行過程中優化設置的。DBA根據數據庫的運行狀況不僅可以調整數據庫系統全局區(SGA區)的數據緩沖區、日志緩沖區和共享池的大小,而且還可以調整程序全局區(PGA區)的大小。

系統全局區(SGA)是一個分配給ORACLE包含ORACLE數據庫實例控制信息的內存段。SGA的大小對系統性能的影響極大,其缺省參數設置只適用於配置很低的計算機,對現有較大資源的系統,這些參數若不作調整,會對系統資源造成巨大浪費。例如:現有服務器系統內存為256MB時,SGA的大小以160MB左右為宜。初始化參數文件中的一些參數對SGA的大小有決定性的影響。參數DB-BLOCK-BUFFERS(SGA中存儲區高速緩存的緩沖區數目),參數SHARED-POO-L-SIZE(分配給共享SQL區的字節數),是SGA大小的主要影響者。DB-BLOCK-BUFFERS參數是SGA大小和數據庫性能的最重要的決定因素。該值較高,可以提高系統的命中率,減少IPO。每個緩沖區的大小等於參數DB-BLOCK-SIZE的大小。ORACLE數據庫塊以字節表示大小。ORACLESGA區共享池部分由庫高速緩存、字典高速緩存及其他一些用戶和服務器會話信息組成,共享池是最大的消耗成分。調整SGA區各個結構的大小,可以極大地提高系統的性能[2]:

(1)調整LibraryCache

庫高速緩存(Library Cache)中包含私用和共享SQL區和PLPSQL區。調整SGA的重要問題是確保庫高速緩存足夠大,以使ORACLE能在共享池中保持分析和執行語句,提高語句分析和執行效率,降低資源消耗。通過比較LibraryCache的命中率來決定它的大小。

(2)調整數據字典高速緩存(DictionaryCache)

數據字典高速緩存包括了有關數據庫的結構、用戶、實體信息等。數據字典的命中率對系統有很大的影響。

(3)調整數據庫緩沖區高速緩存

ORACLE在運行期間向數據庫高速緩存讀寫數據,高速緩存命中表示信息已在內存中,高速緩存失敗意味着ORACLE必需進行磁盤IPO。保持高速緩存失敗率最小的關鍵是確保高速緩存的大小。初始化參數DB-BLOCK-BUFFERS控制數據庫緩沖區高速緩存的大小。[9]

 

2.2 調整磁盤IPO

磁盤IPO是系統性能的瓶頸,解決好磁盤IPO,可明顯提高性能。通過查詢VÃFILESTAT可以知道每個物理文件的使用頻率(phyrds表示每個數據文件讀的次數,phywrts表示每個數據文件寫的次數)[10]

SQL>SELECTname,phyrds,phywrts FROM VÃdatafile df,VÃfilestat fs WHEREdf.file#=fs.file#;

對於使用頻率較高的物理文件,可以采用以下策略:

(1)將組成同一個表空間的數據文件平均分配在盡可能多的磁盤上,做到磁盤之間IPO負載均衡;

(2)為表和索引建立不同的表空間;

(3)將數據文件與重做日志文件分離在不同的磁盤上;

(4)減少不經ORACLESERVER的磁盤IPO。

 

2.3 調整資源競爭

當多個進程對相同資源發出申請時,產生競爭。

(1)修改process參數

該參數定義可以同時連接到ORACLE數據庫的最大進程數,缺省值為50。注意,ORACLE的后台進程也包括在此數目中,建議將該值改為200。

(2)減少調度進程的競爭

減少調度進程的競爭,通過查詢VÃdispatcher表來判定調度進程的競爭SQL>SELECT   network,sum(busy)Psum(busy)+sum(idle)

FROM VÃdispatcher GROUP BYnetwork;

如果某種協議忙的比率超過50%,應增加MTS-DISPATCHERS的值。

(3)減少多線程服務進程競爭

首先查詢VÃSYSSTAT表判定是否發生多線程服務進程競爭:

SQL>SELECT DECODE(total q,0,.No request.,

waitPtotal q+.hunderths of seconds.)

FROM VÃsysstat WHERE type=.common.;

如果共享服務進程數量已達到初始化參數文件中MTS-MAX-SERVERS指定的最大值,但應用運行時,平均請求等待時間仍持續增長,那么,應加大MTS-MAX-SERVERS的值。

(4)減少重做日志緩沖區競爭

通過查詢VÃSYSSTAT表判定redo log文件緩沖區是否足夠。

SQL>SELECTname,value

FROM VÃsysstat

WHERE name=.redo log space request.;

此處value的值應接近於0,否則,應增大初始化參數文件的LOG-BUFFEQS的值[11]

(5)減少回退段競爭

回退段對性能也有影響,根據事務大小情況來分配合適的回退段。

首先判定回退段的數量能否滿足系統運行的需要:

查詢VÃWAITSTAT表與VÃSYSSTAT表

SQL<SELECTclass,count FROM VÃwaitstat

WHERE class IN(.systemundo header.,systemundo

block.,.undo header.,.undo block.);

SQL>SELECTsum(value) FROM VÃsysstat WHERE nameIN(.db block

gets.,.consistentgets.);如果任何一個classPsum(value)

>10%,那么考慮增加回退段。

(6)減少Free List競爭

當多個進程同時向一個表中插入數據時,產生Free List競爭。

 

3. 優化數據庫物理結構

3.1 優化設置控制文件的個數,位置及其備份

建議CONTROL_ FILE初始化參數中指定多個文件應大於2,並將控制文件鏡像到不同位置,並要把這些控制文件備份到安全的磁盤中。

 

3.2 優化設計表空間,數據文件的大小及位置

3.2.1 設計表空間

盡量把同一時間對磁盤的讀寫操作分散開,如對一個表中數據進行更新時,數據庫將同時去讀該表中的數據和該表上的索引信息,如果把表的數據信息和索引信息都放在同一個數據文件中,則數據庫的速度將會變慢。最好是把數據信息和索引信息分別放在不同磁盤的兩個數據文件中,此時數據庫對磁盤的讀寫操作將分散在兩個磁盤上,速度將得到顯著提高。因此在設計數據庫的表空間和數據文件時,首先給表和表的索引分別創建兩個表空間(存放用戶數據的數據表空間和存放表索引的索引表空間)。另外,還根據該系統的數據量的大小及系統中的數據的性質不同,再考慮創建幾個數據表空間或者給數據表空間添加幾個數據文件。

3.2.2 設計數據文件的大小

把記錄大小相當的表放在同一個表空間中,這時一個表空間的存儲參數設置,可以保證表中的記錄都放在一個范圍中,避免了一條記錄跨范圍存放,可以明顯數據庫的性能。

3.2.3 設計數據文件的位置

為了避免磁盤的I/O操作沖突,應把數據文件創建在不同位置。

 

3.3 優化設計重演日志文件

3.3.1 重演日志文件的大小

由於數據庫在利用重演日志文件時是循環使用它們的,而且當LGWR進程在兩個日志文件切換時,將自動產生一個檢測點,所以重演日志文件的大小會直接影響到檢測點出現的頻率。而由於在數據庫檢測點時,對用戶而言,數據庫的速度會受影響,所以檢測點的出現頻率大,或者檢測點正好出現在數據庫處理數據高峰期,將會極大影響數據庫的性能。因此,重演日志文件的大小設計,應考慮檢測點出現的頻率以及檢測點應避開數據庫處理數據的高峰期。

3.3.2 重演日志文件組的個數

在ARCHIVELOG模式下時,適當增加重演日志文件組的個數,可以降低數據庫存檔日志文件的頻率。

3.3.3 重演日志文件的存檔

應把重演日志文件的存檔之處設置在磁盤讀寫更快的物理設備上。這樣可以減少日志文件的存檔時間。[5]

 

4. 數據庫集群

集群是一組相互獨立的、通過高速網絡互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理.數據庫集群系統是由多個共享一個數據庫的有獨立操作系統的服務器組成[6]

Oracle 10g RAC是一種基於網格服務的數據庫集群系統架構,它具有每一層計算堆棧上的虛擬化、根據策略和動態需求來分配工作和資源、集中資源以提高利用率、能自我調整和修補、可統一管理和供應的特點[7].

每一層計算堆棧上的虛擬化.Oracle 10g RAC通過虛擬化將網格中的每一個物理和邏輯實體都抽象為一項服務.虛擬化使得網格中的存儲器、處理器、數據庫服務器等組件緊密地集成在一起,並且使得每一個組件在不損害整體的系統性能的前提下,根據不斷變化的環境快速地作出反應,快速適應並屏蔽組件故障.此外,RAC是動態地創建一個連接,將來自某個特定應用程序的請求分配給數據庫集群中的一個服務器節點處理.

根據策略和動態需求來分配工作和資源.RAC通過網格服務中介自動且動態地將網格的某個元素的資源需求和另一個元素的資源可用性連接在一起,動態地分配需要處理的服務器請求、需要訪問和使用的數據以及需要執行的計算,使資源得到有效地利用.隨着環境的變化,它還能調整這種關聯.根據制定的策略,RAC進一步優化了集群中資源請求者與資源提供者之間的關聯,使得預期的高峰需求等問題得到了有效處理.

集中資源以提高利用率.RAC通過網格服務動態地將服務消費者與服務提供者連接在一起,並通過共享的磁盤存儲陣列及構建數據庫集群系統將資源合並和集中,實現了更高的資源利用率.

自我調整和修補.RAC具有自我調整和修補的自適應功能,使得系統接管了許多過去必須由管理員才能處理的工作,並且系統處理得比以前更好.這樣,不僅提高了系統效率,而且使得管理員有更多的時間和精力去做更重要的工作.

統一管理和供應.RAC通過將集群系統看作單個邏輯實體,使用自我管理功能和數據庫控制來統一、監控和管理網格中的每一個元素.通過圖形化的Web管理界面,管理員可以主動監視數據庫,並很快得到任何系統瓶頸問題或者任何不可用組件所引起的警報和建議.[8]

 

5. 結語

數據庫應用系統的優化是一個系統工程,涉及的方面很多。程序員和數據庫管理員需要認真分析Oracle在運行過程當中出現的各種問題,以保證Oracle數據庫應用系統運行的高效率。

遺憾的是,對像Oracle這樣的數據庫進行調整和性能調節並不是一件容易的事。Oracle帶有幾種監控和調試工具,功能強大,但精通掌握十分困難。這就需要開發一個數據庫應用系統優化軟件,對程序員和有經驗的數據庫管理員都適用。程序員可以把它用在基於Oracle的應用系統的開發過程和測試過程中,而數據庫管理員會覺得有益於調整已開發出來的應用系統,因為數據庫隨時間不斷變化,數據庫管理員們能使用該軟件即時查看數據庫內部的運行情況,從而使數據庫應用系統的性能得到提高。相信不久,人們將開發出一個適合程序員和數據庫管理員使用的數據庫應用系統優化軟件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM