劉哲
(武漢紡織大學,湖北 武漢430200)
大型關系數據庫Oracle已經廣泛應用于各行各業,如政府、交通、公安、電信、金融、能源等部門,并已逐漸成為企業信息化建設的重要數據庫平臺,但隨著Oracle數據庫規模的擴大,數據庫用戶人數的增加,數據庫性能問題越來越突出。因此,有必要對Oracle數據庫性能進行調整與優化,使之在滿足需求條件下,系統性能達到最佳和系統開銷最小。
數據庫吞吐量指在單位時間內數據庫所能完成的SQL語句事務數量,吞吐量=事務量/時間,通常用TPS(每秒鐘的事務量)來表示。對某些特定的系統而言,系統調整最終要的目的可能就是對系統吞吐量的調整。
響應時間是指從用戶提交SQL語句到數據庫返回結果集的第一行數據所需要的時間,縮短響應時間可以通過減小系統服務時間或用戶等待時間來實現,通過使用ms來表示,通過縮短響應時間,既能減少用戶請求的處理時間,又能提高系統資源利用率。
Oracle數據庫將數據儲存在磁盤和內存中,想要往Oracle中寫入和讀取數據基本上都會涉及到I/O操作,通過對磁盤合理的進行規劃,利用高速緩存技術,可以提高系統吞吐量,縮短用戶響應時間,盡可能有效地利用系統物理內存而盡量避免或推遲使用磁盤I/O操作。
Oracle用戶進程所需的所有數據都是經過緩沖區高速緩存來存取的。用戶對數據的需求能否在內存中得到滿足,給出快速的響應,可用緩沖區高速緩存命中率來衡量。
在大量并發用戶數下,若Oracle內存尺寸不夠會降低程序的處理效率,延緩數據庫的響應時間,內存是否合理使用,一般可以從使投資得到最大回報和使爭用減到最小這兩個指標來判斷,通過合理使用內存,可以大大提高系統性能。
當用戶提交的SQL語句含有聚合函數或者有排序時,這些排序可能在內存中進行,也可能在物理磁盤上進行。由于物理磁盤自身結構的原因,其讀寫速度遠遠慢于內存讀寫,因此一個優化的原則是盡可能減少物理磁盤排序操作。
影響Oracle數據性能的因素有很多,如操作系統,CPU性能,內存分配不合理,Oracle配置,I/O沖突,網絡速度低以及SQL使用常見錯誤等都會影響數據庫的性能。
(1)操作系統。Oracle數據庫服務器很大程度上依賴于運行服務器的操作系統,操作系統配置不合理會直接降低Oracle性能。
(2)CPU占用過高。CPU是服務器中一個重要的資源,CPU資源被其它應用占用或被某個數據庫事務占用,會導致其它數據庫事務運行停滯,而使數據庫響應遲鈍,比如:空閑時,CPU占用率超過90%,則說明Oracle服務器CPU資源不足,低效率的SQL語句、鎖沖突、SQL語句的重解析等原因都會引起CPU資源不足。
(3)I/O沖突。由于磁盤在同一時刻只能滿足一個進程的需要,當多個進程同時訪問同一個磁盤時,會引起讀寫盤沖突,進而降低整個系統的速度。
(4)Oracle配置。每一個Oracle實例都是由一組Oracle后臺進程和系統全局區的一個內存區所組成的,正確調整Oracle配置將會對系統性能產生重大的影響。
(5)內存分配不合理。多數操作系統使用虛擬內存來擴大內存,它實際上屬于磁盤空間。當實際的內存空間不能滿足應用軟件的要求時,操作系統就將這部分的磁盤空間與內存中的信息進行頁面替換,這將引起大量的磁盤I/O操作,使整個服務器的性能下降。調整操作系統的主要目的就是減少內存交換,減少分頁,使SGA留駐內存。
(6)網絡速度低。網絡的帶寬會在一定程度上影響系統的整體性能,網絡速度過低會增加網絡如負荷量,從而降低數據庫系統的吞吐量并延長用戶響應時間。
(7)SQL使用常見錯誤。配置和數據遷移的錯誤,大量遞歸SQL語句的存在,長時間的全表掃描,一些數據庫結構的設置不合理,重做日志文件的不合理設置I/O設備的不合理的規劃,非標準參數的使用,執行效率很差的SQL語句,游標和共享池的錯誤使用。
要在良好的Oracle方案中實現最優的性能,最關鍵的是要有一個很好的數據庫設計方案。這一部分應在開發信息系統之前完成。盡管Oracle系統本身己經提供了若干種對系統性能進行調節的技術,但是,如果數據庫設計本身就有問題特別是結構設計,那么再怎么對數據庫進行調整和優化都達不到很好的效果。因此提高數據庫應用系統的性能首先應從數據庫設計開始。
數據庫設計分為邏輯設計和物理設計。邏輯設計包括使用數據庫組件為業務需求和數據建模,而無須考慮如何或在哪里物理存儲這些數據。物理設計包括將邏輯設計映射到物理媒體上、利用可用的硬件和軟件功能盡可能快地對數據進行物理訪問和維護,包括索引技術。邏輯設計主要是消除冗余數據,提高數據的吞吐速度,保證數據的完整性,但對于多表之間關聯查詢(尤其是大數據表),將會影響其性能。因此,在物理設計時需要折衷考慮,根據業務規則和關聯表的數據量大小、數據項訪問頻度,對關聯查詢頻繁的數據表適當提高數據冗余設計。
Oracle的信息存儲在內存和磁盤上,由于訪問內存比訪問磁盤快得多,在大量并發用戶數下,如果Oracle內存尺寸不夠會降低程序的處理效率,延緩數據庫的響應時間,提高數據庫性能需要設置合適的內存尺寸,Oracle內存包括系統全局區(SGA)和程序全局(PGA)。
4.2.1 調整SGA的大小
根據數據庫運行狀況重新調整SGA的大小,對每個節點修改SGA大小的方法如下:
SQL>alter system set sga_target=300mscope=both sid='***'。
4.2.2 提高共享池性能
共享池主要是用來存放最近使用過的SQL語句,共享池內存分配算法保證了數據字典數據比庫緩沖區數據在內存停留時間更長,命中率更高,應優先調整庫緩沖區。
通過調整參數SHARED POOL SIZE的值,可以根據實際情況對每個節點共享池的大小進行調整;為了提高共享池命中率,可以使用代碼重用方法;對于比較大的對象,如自定義的過程與包,在載人共享池以及硬解析的過程中需要共享池付出很大的代價,把重要的大對象保持在內存中,可以大大提高共享池性能。
4.2.3 優化數據緩沖區高速緩存性能
為減少系統磁盤I/O開銷,應調整數據緩沖區的尺寸,使服務器進程盡量在緩沖區中找到所需的數據,盡量減少等待數據塊或空閑緩沖區的時間。加大Buffer Cache的大小,可以通過調整DB_ACHE_SIZE參數的值增大Buffer Cache。使用多個緩沖池,Keep池中數據傾向于一直保存,Recycle池中的數據傾向于即時老化,而Default池則存放未指定存儲池的數據,通過使用多個緩沖池提高Buffer Cache的命中率。
數據庫的數據最終要存儲在物理磁盤上。磁盤I/O操作是數據庫性能最重要的方面,它是系統消耗最大的Oracle數據庫操作。為了避免與I/O相關的性能瓶頸,監控磁盤I/O并對其進行調整非常重要。影響磁盤UO的性能的主要原因有磁盤競爭、I/O次數過多和數據塊空間的分配管理。
SQL語句優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充分利用索引來減少表掃描的I/O次數,盡量避免表搜索的發生.優化的目的就是將性能低下的SQL語句轉換成目的相同的、性能優異的SQL語句,使數據查找的路徑最簡化,并盡量保持處理器時間和I/O時間的平衡。
盡量減少對數據庫的查詢次數,對幾個表查詢時FROM子句的順序,按照由內及外的訪問順序應把可篩選出較少記錄的表放在前面,執行時最先查找出這個表的幾個記錄,再和其他表的記錄相連接;為了充分利用庫緩沖區的SQL解析信息,對于經常運行條件子句變量值不同的SQL語句,應將這些變量改為統一的綁定變量;避免不帶任何where條件的SQL語句的執行,使用order by,group by,union等條件的SQL語句會對查詢完的數據進行排序,增大了PGA或TEMP的負擔,優化這些語句時可在使用這些條件的列上加上有序索引;對SQL語句的索引進行優化,索引的目的是提高數據訪問速度,Oracle的索引都是獨立于與之相關的表或簇中的數據的。如果對索引進行良好的配置和優化,則可以大大降低數據庫中數據文件的I/O操作并提高系統性能和響應速度。
選取約為4G左右的東風日產管理系統作為數據庫優化實例,該數據庫運行在HP DL380G7 583917-B21服務器上,使用Linux操作系統,優化結果如圖1。從圖1可以看出,數據庫經過調整優化數據庫、調整與優化內存、調整與優化I/O和SQL優化后,響應時間變得越來越短,系統性能得到逐步提高。

圖1 性能調優
隨著Oracle數據庫規模的擴大,用戶數量的增加,Oracle數據庫性能問題越來越突出,Oracle數據庫的性能優化涉及的方面很廣,優化與調整是一個需要通過不斷摸索、總結的過程,在實踐中,必須先了解影響數據庫系統性能的因素,針對這些不同的因素選擇合理的優化調整策略予以調整,同時也需要采取更加先進的技術來對數據庫進行調優,使得數據庫系統獲得最優性能。
[1]蓋國強.循序漸進Oracle數據庫管理、優化與備份恢復[M].北京:人民郵電出版社,2007.
[2]趙夢勤,李秀蘭.ORACLE數據庫應用系統的優化策略[J].計算機工程與應用.2003(27):217~218.
[3]潘 敏.Oracle數據庫性能優化的分析[J].電腦編程技巧與維護,2010(20):21~22.
[4]韓云波.Oracle性能調整技術研究[J].電腦知識與技術,2010(7):65~66.